c++ 面试题目 算法

sdenli 2008-07-15 10:08:20
有一组数组长度如是100万 , 内部数据是从1 到 100万随即无顺序排列,同要求对其进行排序,请问使用什么方法可以效率最高
或有什么其它的方法,请分析
...全文
305 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
RocWay007 2008-07-17
  • 打赏
  • 举报
回复
一般栈只有1M的空间,所以还是new比较稳妥,当然除非人为修改栈空间大小。
jieao111 2008-07-15
  • 打赏
  • 举报
回复

按平均时间将排序分为四类:

(1)平方阶(O(n2))排序
 一般称为简单排序,例如直接插入、直接选择和冒泡排序;

(2)线性对数阶(O(nlgn))排序
 如快速、堆和归并排序;

(3)O(n1+£)阶排序
 £是介于0和1之间的常数,即0<£<1,如希尔排序;

(4)线性阶(O(n))排序
 如桶、箱和基数排序。

各种排序方法比较

简单排序中直接插入最好,快速排序最快,当文件为正序时,直接插入和冒泡均最佳。

影响排序效果的因素

 因为不同的排序方法适应不同的应用环境和要求,所以选择合适的排序方法应综合考虑下列因素:
  ①待排序的记录数目n;
  ②记录的大小(规模);
  ③关键字的结构及其初始状态;
  ④对稳定性的要求;
  ⑤语言工具的条件;
  ⑥存储结构;
  ⑦时间和辅助空间复杂度等。

不同条件下,排序方法的选择

(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
 当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
 快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
 堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。
 若要求排序稳定,则可选用归并排序。但本章介绍的从单个记录起进行两两归并的 排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,然后再两两归并之。因为直接插入排序是稳定的,所以改进后的归并排序仍是稳定的。

http://student.zjzkb.edu.cn/course_ware/data_structure/web/main.htm
yakashop 2008-07-15
  • 打赏
  • 举报
回复
用位图法
mrliu_xz 2008-07-15
  • 打赏
  • 举报
回复
都是整数的话可以用计数法排序
复杂度O(n)
sdenli 2008-07-15
  • 打赏
  • 举报
回复
....
gaoteng1984 2008-07-15
  • 打赏
  • 举报
回复
我总结一下:
1.如果这100万个数没有缺失和重复,就不用排序,直接a[i]=i完事儿(题目本意可能不是这个)
2.位图法只适用于没有重复的情况。如果有重复元素,位图法无法记录每个元素的出现次数。但如果真没重复元素,用1方法就可以了。
3.如果有重复:如果足够的内存,即(100万*4B)约等于4MB的内存空间,使用改进的位图法最快。时间复杂度O(N),空间复杂度O(N)。即开个unsigned int a[100*10000]大小的数组,然后每一个元素表示一个数出现了几次,比如a[8]==5表示"8"出现了5次。扫描数组,累加a[出现的数]即可。
4.如果内存实在少得可怜,连4MB都没有,就只能用归并排序了。内存有多大,就总共开辟多大的数组。
sdenli 2008-07-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xibeitianlang 的回复:]
等到用的时候在直接排序就行,不用就不排了,最好先free(数组);
[/Quote]

???
zzstv 2008-07-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pc_fly 的回复:]
引用楼主 sdenli 的帖子:
有一组数组长度如是100万 , 内部数据是从1 到 100万随即无顺序排列,同要求对其进行排序,请问使用什么方法可以效率最高
或有什么其它的方法,请分析


我认为这是道脑筋急转弯的题。排什么排?反正长度是1到100万,而其中的数也是1到100万,那就a[i]=i不就可以了?当然前提是数没有缺失和重复。
[/Quote]
确实啊
xibeitianlang 2008-07-15
  • 打赏
  • 举报
回复
等到用的时候在直接排序就行,不用就不排了,最好先free(数组);
sdenli 2008-07-15
  • 打赏
  • 举报
回复
...
RocWay007 2008-07-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 sdenli 的帖子:]
有一组数组长度如是100万 , 内部数据是从1 到 100万随即无顺序排列,同要求对其进行排序,请问使用什么方法可以效率最高
或有什么其它的方法,请分析
[/Quote]

我认为这是道脑筋急转弯的题。排什么排?反正长度是1到100万,而其中的数也是1到100万,那就a[i]=i不就可以了?当然前提是数没有缺失和重复。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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