【算法】2013百度校园招聘南京站最后一题:一个有100亿个元素的整型数组,它的元素是有序的,现在把它分成若干段,每段不超过20个元素,每段的元素个数不等,现在

pengfoo 2012-10-21 07:17:48
一个有100亿个元素的整型数组,它的元素是有序的,现在把它分成若干段,每段不超过20个元素,每段的元素个数不等,现在在每段内将这些元素的顺序打乱,然后重新将这100亿个元素的数组排序,请问时间复杂度最小的算法是什么?并给出时间复杂度。

请大家来一起讨论讨论。。。
...全文
1077 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
TinySun 2012-10-23
  • 打赏
  • 举报
回复
100亿个数,整体已经排好序,但局部无序。若每个段都是固定的,那么,只需把每小段都进行排序即可,但每段的长度是不同的,又该如何分析?
举个例子,原数组是:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
每段数据不超过5进行打乱后(打乱的长度为5,3,4,3),数组为:
2,5,3,4,1,7,8,6,11,9,12,10,14,15,13
是一个整体有序,局部无序的数组。考虑到其限制:每段数据不超过5个,故数据位置的偏移量(偏离原来的位置)最多为4(乱序位置-原始位置,取绝对值),我们可以这么做
先对前5个排序,得到数组arr=1,2,3,4,5
再对6到10个数进行插入arr排序,得到arr=1,2,3,4,5,6,7,8,9,10
再对11到15个数进行插入arr排序,得到arr=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
整个数组排序完成。
观察这个结果,假设第1到第5n个数已经有序为sort(5n),那么我们要将5n+1到5n+5这5个数据添加到已排序的数组中,只需要进行插入排序,将这5个数添加进即可。由于分段的长度不超过5,所以第5n+1个数在插入的时候,最多只需要搜索到第5n-4个数就可以了,比较个数不会超过5次。又因为5n+1到5n+5是已经排好序的,所以,后面的数比较次数也不会超过5次(最多比较到前一个插入的位置)。因此,每加入5个数到已排序数组中,时间复杂度是O(5*5),
假设长度为N,每段长不超过K。则每段插入的时间复杂度即为O(K*K)。
而对于以段为单位插入的操作,需要进行N/K次,所以,总的时间复杂度是O(K*K)*O(N/K)=O(NK)
回到原题由于每个段的长度不超过20,我们可以先以20为长度单位,从前到后,对每一小段进行插入前面的数组的插入排序,就能够完成。考虑到数组较长,无法全部存入内存,故无需对整个数组进行存储,只需要取要插入的段前面的那个数组就可以了(原因之前分析过)。可以在每排序完一定长度的数组时,进行存储并释放内存。
代码还没写,写完了会在这贴出来,还有这次笔试的所有题
http://blog.csdn.net/zyy5411/article/details/8104493
qianyinggaozhong 2012-10-22
  • 打赏
  • 举报
回复
都没学过算法啊!真是不好意思啊,有些时候问的问题和实际做项目根本没什么关系啊!
AndyZhang 2012-10-22
  • 打赏
  • 举报
回复
接近o(n)吧
bluewanderer 2012-10-22
  • 打赏
  • 举报
回复
设总数为N,给所有段排序的总复杂度是O(N),因为给每段排序需要的总循环次数小于常数log20。合并的复杂度还是O(N),因为段已经是按顺序的不需要归并只需要连接就行了。最终复杂度还是O(N)

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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