一道算法题

zhu_nn 2010-07-10 08:03:09
一个长度为1亿的整数数组,是整体有序(升序),局部无序的(个别元素比前面的小),而且这种局部无序分布的比较离散,现在请设计出一种比较高效的算法出来,将数组排好序,数组里面有一部分重复的数。
呵呵,大家集思广益啊,尽量多想点好方法。
...全文
214 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fanster28_ 2010-07-12
直接贪心抓升序串可能遇到如下情况

比如每5个有一个无序
5 1 2 3 4 10 5 6 7 8

这样贪心出来n/5 剩下0.8n
回复
wxc1987821 2010-07-12
mark
回复
angel6709 2010-07-12
100,000,000=100M
第一遍过滤,过滤时做一些手脚,如分分段,。。每一段的最大,最小值
第二遍对每一个元素插入排序,插入到相应的段中。。
估计总复杂度小2n
回复
showjim 2010-07-12
感觉直接插入排序效率最高
回复
oyzdz1988 2010-07-12
对,楼上的想法没错,

归并排序~
回复
宅男小何 2010-07-12
这样的数据建议用归并排序,效率高!
http://blog.csdn.net/lazy_p/archive/2010/05/04/5557469.aspx
回复
AAA20090987 2010-07-10
如果无序的元素比较少,就用直接插入排序
如果无序的元素比较多,就用2楼的方法。
回复
qqcrazyer 2010-07-10
这相我不知道
回复
zhu_nn 2010-07-10
[Quote=引用 2 楼 fancymouse 的回复:]

贪心抓一个升序串,大体有序的话而且无序是比之前的小的话,那抓出来的这个升序串应该覆盖了大部分的原串。
然后把不在这个串里的拿出来,做传统排序,再和上面那个的归并。O(n+klogk),k是不在升序串里的元素个数。
当然内存还是O(n)的。
[/Quote]
这个和直接做插入排序一样吧?
回复
FancyMouse 2010-07-10
贪心抓一个升序串,大体有序的话而且无序是比之前的小的话,那抓出来的这个升序串应该覆盖了大部分的原串。
然后把不在这个串里的拿出来,做传统排序,再和上面那个的归并。O(n+klogk),k是不在升序串里的元素个数。
当然内存还是O(n)的。
回复
jdtxse 2010-07-10
数据好大。如果算法稍稍不好,就算不出来了。
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告