用小组数进行大量随机整数排序,如何实现?

hiyoung 2009-03-21 11:10:47
如何只用一个大小为10的数组或列表来排序1000个随机整数?要求比较的次数尽量少,可以定义其他变量,但数组或列表之类的集合数据结构只可以用一个(大小为10的数组或列表).可以用Java或C/C++实现.请大家指点下,谢谢。
...全文
211 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
effective_person 2009-03-22
  • 打赏
  • 举报
回复

// 看看这个方法吧,那里再开辟空间啊

template <typename T>
void Sort<T>::Sift(T a[],int k,int m) // 建立堆
{
int i,j;
T temp;

if(k==m) // 叶子不需要建立堆
return ;
i=k,j=2*i; // 从右下开始建立堆
while(j<=m)
{
if(j<m&&a[j]<a[j+1]) // 从左右孩子找出最小的元素
j++;
if(a[i]>a[j])
break;
else // 实现父与子的交换
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
i=j; // 建立上一层的堆
j=2*i;
}
}
}
template <typename T>
void Sort<T>::HeapSort(T a[],int size) // 堆排序
{
T temp;
int i=size/2;

for(;i>=0;i--) // 建立堆
Sift(a,i,size-1);
for(i=0;i<size;i++) // 交换堆的根与最末一个元素
{
temp=a[0];
a[0]=a[size-i-1];
a[size-i-1]=temp;
Sift(a,0,size-i-2); // 进行下次的建立堆
}
}
effective_person 2009-03-22
  • 打赏
  • 举报
回复
#ifndef _Sort_h
#define _Sort_h
template <typename T>
class Sort // 排序类
{
public: // 静态方法
static void InsertSort(T a[], const int size);// 插入排序
static void ShellSort (T a[], const int size);// 希尔排序
static void BubbleSort(T a[], const int size);// 冒泡排序
static void QuickSort (T a[], const int first, const int end);
// 快速排序
static void SelectSort(T a[], const int size);// 选择排序
static void HeapSort (T a[], const int size);// 堆排序
static void MergeSort (T a[], const int size);// 归并排序
private: // 划分区域
static int Divide_Part (T a[], int first, int end);
// 一下是归并排序的内部方法
static void Sift (T a[], int k , int m );
static void MergeSort_In (T a[], T ta[], int low, int high);
static void Merge (T a[], T ta[], int low, int mid, int high);

};
template <typename T>
void Sort<T>::InsertSort(T a[],const int size)
{
int i;
int j; // 定义局部变量
T temp;

for(i=1;i<size;i++) // 插入排序
{
temp=a[i]; // 哨兵
for(j=i-1;a[j]>temp&&j>=0;j--)
a[j+1]=a[j];
a[j+1]=temp; // 插入到合适的位置
}
}
template <typename T>
void Sort<T>::ShellSort(T a[],const int size)
{
int d; // 定义局部变量
int i;
T temp;
int j;

for(d=size/2;d>=0;d--) // 分组进行插入排序
{
for(i=d;i<size;i++) // 插入排序,注意步长为d
{
temp=a[i];
for(j=i-d;a[j]>temp&&j>=0;j=j-d)
a[j+d]=a[j];
a[j+d]=temp; // 将元素插入合适的位置
}
}
}
template <typename T>
void Sort<T>::BubbleSort(T a[],const int size)
{
int i,j; // 定义局部变量
T temp;

for(i=0;i<size;i++) // 采用冒泡排序
{
for(j=i+1;j<size;j++)
{
if(a[i]>a[j]) // 交换元素
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
template <typename T>
int Sort<T>::Divide_Part(T a[],int first,int end)
{
int i=first,j=end-1; // 快排,采用划分区域,找到元素合适的位置
T temp;

while(i<j)
{
while(i<j&&a[i]<a[j]) // 右指针左移,直到小于左指针的元素
j--;
if(i<j) // 交换元素
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
i++; // 左指针右移动
}
while(i<j&&a[i]<a[j]) // 左指针右移,直到大于右指针的元素
i++;
if(i<j) // 交换元素
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
j--; // 右指针左移
}
}
return i; // 返回元素找到的合适的位置
}
template <typename T>
void Sort<T>::QuickSort(T a[], const int first,const int end)
{
int mid;

if(first<end) // 进行快速排序
{
mid=Divide_Part(a,first,end); // 第一次划分区域
QuickSort(a,first,mid-1); // 递归快排左区域
QuickSort(a,mid+1,end); // 递归快排右区域
}
}
template <typename T>
void Sort<T>::SelectSort(T a[],const int size)
{
int i,j;
T temp;

for(i=0;i<size;i++) // 每次选择最小的元素放到最前面
{
for(j=i;j<size;j++)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
template <typename T>
void Sort<T>::Sift(T a[],int k,int m) // 建立堆
{
int i,j;
T temp;

if(k==m) // 叶子不需要建立堆
return ;
i=k,j=2*i; // 从右下开始建立堆
while(j<=m)
{
if(j<m&&a[j]<a[j+1]) // 从左右孩子找出最小的元素
j++;
if(a[i]>a[j])
break;
else // 实现父与子的交换
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
i=j; // 建立上一层的堆
j=2*i;
}
}
}
template <typename T>
void Sort<T>::HeapSort(T a[],int size) // 堆排序
{
T temp;
int i=size/2;

for(;i>=0;i--) // 建立堆
Sift(a,i,size-1);
for(i=0;i<size;i++) // 交换堆的根与最末一个元素
{
temp=a[0];
a[0]=a[size-i-1];
a[size-i-1]=temp;
Sift(a,0,size-i-2); // 进行下次的建立堆
}
}
template<class T>
void Sort<T>::MergeSort(T a[], const int size) // 归并排序
{
T *ta;

ta=new T[size]; // 开辟同样的空间
MergeSort_In(a, ta, 0, size-1); // 堆排序
delete []ta; // 回收空间
}
template<class T>
void Sort<T>::MergeSort_In(T a[], T ta[], int low, int high)
{
int mid;

if (low<high) // 开始归并排序
{
mid=(low+high)/2; // 取中间值
MergeSort_In(a, ta, low, mid); // 递归左区域
MergeSort_In(a, ta, mid+1, high); // 递归右区域
Merge(a, ta, low, mid, high); // 合并左右区域
}
}
template<class T>
void Sort<T>::Merge(T a[], T ta[], int low, int mid, int high)
{
int i=low, j=mid+1, k=low;

while (i<=mid && j<=high)
{
if (a[i]<=a[j])
ta[k++]=a[i++];
else
ta[k++]=a[j++];
}

if (i>mid)
{
while (j<=high)
ta[k++]=a[j++];
}
else
{
while (i<=mid)
ta[k++]=a[i++];
}

for (k=low; k<=high; ++k)
a[k]=ta[k];
}

#endif __Sort_h





// 送给你本人的多年的积累吧,贴出了你需要的部分了

#include <iostream>
#include "Sort.h"
#include "time.h"
using namespace std;
void test_Sort();
int main()
{
//test_linkList();
//test_Seqstack();
/*test_Seqlist();*/
/*test_Linkstack();*/
/*test_Seqqueue();*/
//test_Linkqueue();
/*test_Cirlist();*/
//test_Binarytree();
test_Sort();
}

void test_Sort()
{
int a[1000];
srand(NULL);
for(int i=0;i<sizeof(a)/sizeof(*a);i++)
{
a[i]=rand()%1000000;
}
clock_t begin,end;
begin=clock();
Sort<int>::HeapSort(a,sizeof(a)/sizeof(*a));
end=clock();
//Sort<int>::SelectSort(a,sizeof(a)/sizeof(*a));
//Sort<int>::QuickSort(a,0,sizeof(a)/sizeof(*a));
/*Sort<int>::BubbleSort(a,sizeof(a)/sizeof(*a));*/
/*Sort<int>::ShellSort(a,sizeof(a)/sizeof(*a));*/
/*Sort<int>::InsertSort(a,sizeof(a)/sizeof(*a));*/
/*Sort<int>::MergeSort(a,sizeof(a)/sizeof(*a));*/
for(int i=0;i<sizeof(a)/sizeof(*a);i++)
std::cout<<a[i]<<" ";
std::cout<<std::endl;
cout<<end-begin<<endl;
}


hiyoung 2009-03-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 joanlynnlove 的回复:]
可能是大家理解不同
你的意思是除了这1000数的空间外只需要1个了
我的意思是总共只能用10个以下,不能在1000个数的空间内直接排序

我看楼主好像是我这意思。。。
[/Quote]

谢谢各位,
就是joanlynnlove的意思,原文是这样的:Use any programming language(java, c/c++, python, perl, etc) to sort 1000 integers with only one array or list which can hold only 10 integers. You can use some local/temp variables, but no more collection or list or array structures.
呵呵,还是要谢谢上面的effective_person的C++代码,让我长了不少见识呀,现在我考虑是不是得用外部排序呀~~~~~~~~
acdbxzyw 2009-03-22
  • 打赏
  • 举报
回复
可能是大家理解不同
你的意思是除了这1000数的空间外只需要1个了
我的意思是总共只能用10个以下,不能在1000个数的空间内直接排序

我看楼主好像是我这意思。。。
acdbxzyw 2009-03-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 effective_person 的回复:]
C/C++ code
// 看看这个方法吧,那里再开辟空间啊

[/Quote]

不是不能在原有的数据集合结构内排序吗?
堆排序怎么也得有1000个元素空间要用吧
楼主说了 只能用 10个以下的集合 排序这1000个数
蜥蜴枪王 2009-03-22
  • 打赏
  • 举报
回复
帮顶
  • 打赏
  • 举报
回复
mark,想想
acdbxzyw 2009-03-21
  • 打赏
  • 举报
回复
空间 1000 + 1 吧?
堆排序


突然想了一下 数据在外部好像也行
每次取进来10个数排序,再放回去
effective_person 2009-03-21
  • 打赏
  • 举报
回复
简单一点吧,别想的太多了
用堆排序吧!
时间 nLog2(n)
空间 o(1)
挺好的。
acdbxzyw 2009-03-21
  • 打赏
  • 举报
回复
如果不是外部排序的话
那么存放这1000个数的数据结构应该可用吧?
我的想法是用递归
把1000个数分成10份
再把每100个数分成10份
...
最后每份1个数,在a[10]数组里排好
返回一层
逐个移动a[10],这样可以把不同的份之间排好

呵呵 瞎想的
轻拍。。。

不对 。。。这用到栈了,不知还道算不算
呵呵
nicky_zs 2009-03-21
  • 打赏
  • 举报
回复
怎么听起来好像是在叫你模拟外部排序?
打开链接下载源码: https://pan.quark.cn/s/589796089f72 C++课程设计任务列表,涵盖以下内容:1、识别并显示10至99范围内,各位乘积超过各位和的值,例如字12不满足条件,因为1乘以2小于1加2,故不输出;而字27满足条件,因为2乘以7大于2加7,因此需要输出该。2、开发一个功能,用于从用户输入的任意量实中找出最大值与最小值:首先要求用户输入一个正n,代表值的个,随后用户可输入任意n个实,程序需找出这n个中的最大值和最小值并将它们展示出来。3、实现两个已排序组的合并操作:设有组A和B,且假设这两个组的元素均已按照降序排列。编写程序将A和B合并成一个新的组C,并确保C中的元素同样保持降序排列。int A[10]={123, 86,80, 49,33,15,7,0,-1,-3};int B[10]={100,64,51,50,27,19,15,12,5,2};4、设计一个函,用于计算特定分序列前n项的总和,该序列为1/2,1/3,1/4,1/5,1/6,1/7,...。要求在主程序中提示用户输入一个n,并验证输入的合法性(n需大于1方为有效),若输入合法,则调用求和函并显示计算结果。5、编写一个程序,计算两个用户输入日期之间的天差:用户需以year1,month1,day1和year2,month2,day2的格式输入两个日期,程序随后计算这两个日期之间的天间隔,并将结果输出到屏幕上。要求编制具有如下原型的函difs2Date:long GetDayDifference(int y1,int m1,int d1,int y2,int m2,int d2);并在主函中调用此函,将计...
代码下载地址: https://pan.quark.cn/s/ee8627e4e6d7 ABAP调试器是一种功能强大的工具,可用于在执行期间对ABAP代码进行检验。除了常规的核心功能(例如逐行运行代码以及检验变量、字段符号和引用的值)之外,它还提供了一些辅助性的特性,能够简化并压缩调试会话的时长。并非所有使用者都熟悉这些辅助特性。SAP ABAP调试器是处理和优化ABAP代码开发与维护工作的核心资源,它配备了多样的功能来协助开发人员在运行状态下进行检验和排除故障。此资源着重阐述了ABAP调试器的一些高级特性,涵盖了深入分析调用堆栈、系统级调试、更新会话调试以及提升调试效率的方法。 1. **深入分析调用堆栈**:除了常规的应用程序调试,开发人员有时需要对调用堆栈的内部层级进行深入调试,特别是在错误出现在异步执行的更新处理或系统级程序时。通过启用**系统级调试**,可以访问通常不公开的系统代码,但这也会导致调用堆栈的显著增加,因此需要审慎操作。 2. **系统级调试**:对于不含业务逻辑的系统级程序,开发人员通常无需进行调试。然而,在特定情形下,例如进行错误追踪时,可能需要进入系统代码。借助调试器的“系统调试启用/禁用”选项,可以赋予对系统程序的调试权限。 3. **更新会话调试**:在处理异步更新任务,例如持久化业务据时,错误可能发生在更新任务内部。激活**更新会话调试**,在更新任务完成后,调试器将自动启动,展示执行路径。比如,在变更成本中心后,通过输入调试指令 "/h" 启动调试,保存后能够看到更新过程中的错误。 4. **分析调用堆栈**:在进行深入调试时,调用堆栈是至关重要的。通过分析调用堆栈,能够定位到引发问题的具体位置,如在VB_V2_NORMAL...
源码链接: https://pan.quark.cn/s/a4b39357ea24 小程序雷达 AI 驱动的小程序生态选型与风险评估工具,把微信小程序开发资源转化为可筛选、可评估、可对比的技术雷达。 线上地址 主站: Vercel: 适合谁 正在做微信小程序技术选型的产品、研发和架构团队。 需要判断 Taro、uni-app、原生小程序、组件库、云开发和 SDK 风险的团队。 需要把历史 awesome 列表转成可筛选、可对比、可验证技术雷达的维护者。 可以做什么 Radar:按推荐状态、风险等级、资源类型、分类和适用场景浏览小程序生态资源。 Quick Search:快速搜索资源并跳转常用页面。 Compare:对比 Taro、uni-app、原生小程序等核心方案。 Advisor:输入选型问题,获得推荐结论、适用/不适用条件、迁移成本、下一步和证据来源。 Doctor:粘贴小程序项目配置,识别框架依赖、过时方案和迁移风险。 Weekly:查看小程序生态周报和近期风险信号。 据概览 当前据集中包含 236 个小程序生态资源。 完整资源可在 Radar 页面和导出能力中查看。 核心样例 Taro ★30.6k+ - 使用 React 的方式开发小程序的框架,同时支持生成多端应用 uni-app ★36.1k+ - 使用 Vue 语法开发小程序、H5、App的统一框架 MPX ★2.1k+ - 增强型小程序框架,深度性能优化,支持跨小程序平台开发,完全兼容原生小程序组件 WePY ★21.7k+ - 支持组件化的小程序开发框架 vant-weapp ★12.3k+ - 高颜值、好用、易扩展的微信小程序 UI 库 tdesign-miniprogram ★1.3...

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧