百度软件研发笔试题

acidsweet 2012-10-23 04:10:47
有一个递增数组,大小是10亿,将其分成很多小段,每段长度在20左右但是不一定,将段内的元素打乱,请问写一个效率最高的排序算法使算法重新是个递增数组,给出算法复杂度。
--------------------------------------------------------------------------------------------------
题目大概是这样的。
我的思路是,10亿能存在内存中,而一个元素偏离它正确的位置最多20个单位,使用二路归并排序就好。算法复杂度平均:
时间:O(nlogn)
空间:O(n)申请了一个等长的辅助数组
代码就不贴了,就是一般的归并,请问大家我这种方法是不是算法复杂度最低的算法,大家有没有更好的算法呢?
...全文
581 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
白米若雪 2012-11-05
  • 打赏
  • 举报
回复
插入排序有两层循环,在题目给定的条件下,内层循环的次数不会超过20的。所以是20N。
白米若雪 2012-11-05
  • 打赏
  • 举报
回复
不是的哦,对于局部有序的输入,插入排序的复杂度是O(n)哦。
引用 8 楼 arfee_11 的回复:
引用 7 楼 的回复:直接插入就可以了,复杂度是20N 插入排序的复杂度是O(N^2),所以应该是400N
昵称很不好取 2012-11-01
  • 打赏
  • 举报
回复
在各段上分别执行快排?
arfee_11 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

直接插入就可以了,复杂度是20N
[/Quote]

插入排序的复杂度是O(N^2),所以应该是400N
白米若雪 2012-10-28
  • 打赏
  • 举报
回复
直接插入就可以了,复杂度是20N
Prairial_0 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

要注意这句话:

“每段长度在20左右但是不一定”

所以不能每20个处理一次
我当时的解法是从左向右扫,设数组为arr,当前位置为i,则向右扫到j使得arr[j]>arr[i]且j合法。
然后对arr[i,j)进行插入排序

当然如果数组中数字的重复数很大的话就没办法了。当时也没细想就这么交上去了。
[/Quote]

想了想这个做法肯定是错的
Prairial_0 2012-10-25
  • 打赏
  • 举报
回复
要注意这句话:

“每段长度在20左右但是不一定”

所以不能每20个处理一次
我当时的解法是从左向右扫,设数组为arr,当前位置为i,则向右扫到j使得arr[j]>arr[i]且j合法。
然后对arr[i,j)进行插入排序

当然如果数组中数字的重复数很大的话就没办法了。当时也没细想就这么交上去了。
dbhme 2012-10-25
  • 打赏
  • 举报
回复
其实用插入排序也可以的,不要这么麻烦
dbhme 2012-10-25
  • 打赏
  • 举报
回复
先排1-20,当然多点也可以
然后排21-40,个数也可以多点
找到21-40中最大的不大于1-20中最大的数,假设位置是 30
把21-30跟1-20合并,因为都排好序了,所以合并复杂度低的
现在1-40都排好序了
再排序41-60,同样的跟1-40合并
直到所有的数据都排好序

这个可以应付段的长度超过20比较多的情况
acidsweet 2012-10-23
  • 打赏
  • 举报
回复
的确这个办法挺好,这个对于有>20的段的就不适用了啊....
nice_cxf 2012-10-23
  • 打赏
  • 举报
回复
每段长度在20左右但是不一定?左右是什么意思30算么?应该是以下吧?如果是的话
以前似乎有类似的题目,
思路是按40个分组,先把前40个排序,然后对20-60进行排序,以下类推排序,分段排序结束后整个排序就完成了,时间复杂度是O(n)

33,008

社区成员

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

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