一个介入搜索和排序之间的问题,不知大家有何想法?

super_chris 2009-09-11 07:50:23
一个无序序列,要求输出里面第K小的数。
大家说说。brain storm~
...全文
89 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 litaoye 的回复:]
就像7楼所说的,可以通过一些改进让快排稳定一些,不过我当时测过nthElement,一般情况下,O(n)这个常数为1.5-3之间,但某些极端情况下这个达到过26。

其实用堆排也是个不错的方法,尤其是当m远远小于n时,效率可以达到n+m*log(n),可能比nthElement还要好!

引用 6 楼 sbwwkmyd 的回复:
K应该小于等于n/2,找第K小的数等于找第(n-K+1)大的数,维护一颗接近K个叶节点的大小的B树应该比较稳定。但是快排过程的方法,很多时候表现得更好,但是不稳定。

[/Quote]
我认为快排的改进一般都是针对于实际情况,如果改进方式一旦确定,极端情况还是存在的,只是实际命中极端的概率很低而已.
比如我用快排的时候喜欢取中间节点的值做为切割值,不知道你们都有什么好办法.
我觉得快排的快在数据的修改与访问的"直接"数组操作,而其它方法可能需要创建对象的开销(主要可能是内存申请).
绿色夹克衫 2009-09-14
  • 打赏
  • 举报
回复
就像7楼所说的,可以通过一些改进让快排稳定一些,不过我当时测过nthElement,一般情况下,O(n)这个常数为1.5-3之间,但某些极端情况下这个达到过26。

其实用堆排也是个不错的方法,尤其是当m远远小于n时,效率可以达到n+m*log(n),可能比nthElement还要好!

[Quote=引用 6 楼 sbwwkmyd 的回复:]
K应该小于等于n/2,找第K小的数等于找第(n-K+1)大的数,维护一颗接近K个叶节点的大小的B树应该比较稳定。但是快排过程的方法,很多时候表现得更好,但是不稳定。
[/Quote]
showjim 2009-09-12
  • 打赏
  • 举报
回复
K应该小于等于n/2,找第K小的数等于找第(n-K+1)大的数,维护一颗接近K个叶节点的大小的B树应该比较稳定。但是快排过程的方法,很多时候表现得更好,但是不稳定。
super_chris 2009-09-12
  • 打赏
  • 举报
回复
快排可以做些改进让它变得稳定些
绿色夹克衫 2009-09-11
  • 打赏
  • 举报
回复
可以用类似快速排序的方法,普遍认为复杂度是O(n),LZ搜索一下nthElement吧,网上的资料和程序都很多。

linren 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 super_chris 的回复:]

这好像不是O(n)吧?
[/Quote]
[Quote=引用 3 楼 bffeey 的回复:]

插入操作不是 O(1)
nlnk
[/Quote]

的确不是O(n)……
又弄错了……
bffeey 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 linren 的回复:]
时间复杂度为O(n)

维护一个长度为k的数组……
遍历原数组
有些像是插入排序的把元素插入到k数组中……

遍历完后
k数组的第k个元素就是原数组第k小的数……
[/Quote]
插入操作不是 O(1)
nlnk
super_chris 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 linren 的回复:]
时间复杂度为O(n)

维护一个长度为k的数组……
遍历原数组
有些像是插入排序的把元素插入到k数组中……

遍历完后
k数组的第k个元素就是原数组第k小的数……
[/Quote]这好像不是O(n)吧?
linren 2009-09-11
  • 打赏
  • 举报
回复
时间复杂度为O(n)

维护一个长度为k的数组……
遍历原数组
有些像是插入排序的把元素插入到k数组中……

遍历完后
k数组的第k个元素就是原数组第k小的数……

33,028

社区成员

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

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