快速选择(quick select) 总结

一、快速选择:

适用于无序数组的搜索, 时间复杂度 average case 是 O(N) worst case 是 O(N^2)

复杂度推导:

设算法时间复杂度为T(n)。在第一层循环中,我们将pivot与n个元素进行了比较,这个时间为cn 。
所以第一步时间为:T(n) = cnc + T(n/2)。其中T(n/2)为接下来递归搜索其中一半的子数组所需要的时间。
在递归过程中,我们可以得到如下公式:
T(n/2) = c(n/2) + T(n/4)
T(n/4) = c(n/4) + T(n/8)
...
T(2) = 2*c + T(1)
T(1) = 1*c
将以上公式循环相加消除T项可以得到:
T(n) = c(n + n/2 + n/4 + n/8 + ... + 2 + 1) = 2n = O(n)
因此得到Quick Select算法的时间复杂度为O(n)。
---------------------

最典型的快速选择应用是 快速排序: 分治法 + 快速选择。

 

快速选择每次都会确定一个元素在最终排序的位置,也就是说该元素的两侧,都是一致大于(小于)该元素。

模板:返回坐标值,适用于选Kth的问题。

但是在选Kth的问题中一定要注意第几个和index 相差1的问题

int pivot = nums[low];
        while(low < high){
            while(low < high && nums[high] >= pivot){
                high--;
            }
            nums[low] = nums[high];
            while(low < high && nums[low] <= pivot){
                low++;
            }
            nums[high] = nums[low];
        }
        nums[low] = pivot;
        return low;  

posted on 2019-06-01 13:11  OldJimmy  阅读(1497)  评论(0)    收藏  举报

导航