快速排序、查第k大

参考这里,提到两种方法,并说第二种好:

http://www.cnblogs.com/qsort/archive/2011/05/09/2041653.html

 

qsort的每一趟中,选定pivot以后,partition的过程如下:

开始时,ptrLeft,ptrRight分别指向数组两端;

*ptrLeft小于pivot时,向右走;*ptrRight大于pivot时,向左走;

ptrLeft和ptrRight都走不动的时候,交换对应的元素,继续。

ptrLeft和ptrRight相遇的时候,结束这一趟,然后二分的对两边继续qsort。

更新:这样的做法需要处理各种特殊情况(略),因此更好的思路是:

partition的时候,思路是:

1,将pivot放到序列末尾;

2,两个指针ptr_old_curr、ptr_new_curr从左向右扫描,如果*ptr_old_curr <= pivot,就交换到ptr_new_curr位置;换言之,ptr_new_curr一直指向下一个位置;

3,ptr_old_curr到达末尾后,ptr_new_curr指向第一个大于pivot的位置,将pivot放回这个位置即可。

这样的好处是:完全不需要判断各种异常情况。一个实现参见http://www.cnblogs.com/qsort/archive/2011/08/30/2155923.html

 

查找第k小的数,可以利用qsort中的partition来一次去掉大概一半。

思想如下:Find(k, Left, Right)的时候,先选择一个pivot,来Partition(Pivot, Left, Right)

之后,设Pivot所在位置为Middle,可知Pivot左侧都比Pivot小,右侧都比Pivot大。

如果左侧有大于k个数,那么第k小的数肯定在左侧,可以继续Find(k, Left, Middle)

如果左侧数字小于k个,那么第k小的数肯定在右侧,而且是右侧的第 (k - (Middle - Left + 1) )个数,可以继续Find([k - (Middle - Left + 1)], Middle, Right)了。

 

 
 
posted @   blcblc  阅读(521)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示