快速排序、查第k大
2017-02-14 23:13
190 查看
参考这里,提到两种方法,并说第二种好:
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)了。
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)了。
相关文章推荐
- 快速排序 与 第k小的数
- 【算法-快速排序】第k大元素(Kth Largest Element)
- 快速排序求第K小
- 分治算法的利用例子(查找最大最小数,快速排序,查看第k小的数字)
- 快速排序思想的应用--求数组中第k小的数
- 找包含N个元素的数组里第K大的元素(引申:快速排序、找中位数、找前K大的元素)的时间复杂度
- 清橙OJ 1082 查找第K小元素 -- 快速排序
- 快速排序 求第k大数
- [编程珠玑]-第十一章:快速排序及第k小元素
- 清橙OJ 1082 查找第K小元素 -- 快速排序
- 编程之美-电梯调度-快速排序-查找第K大数
- 快速排序之寻找第k小的值
- 算法竞赛入门经典:第八章 高效算法设计 8.4快速排序应用之第k小的数
- 第K小的数 快速排序 选择前K大O(n)
- 快速排序 and 第K大数
- 快速排序求第k小元素
- 快速排序 && 寻找第K大(小)的数
- 快速排序找第k大的数
- 快速排序
- Win10系统调整快速访问文件夹顺序按照访问时间来排序