快排查找第k大的数

时间复杂度

时间复杂度与二分查找很相似, 都是只找一边. 但是快排不平衡, 且快排需要计算轴心位置.

二分查找的时间复杂度

快排查找第k大的数_第1张图片
二分查找时间复杂度的计算

https://stackoverflow.com/a/8185382

快排查找的时间复杂度

快排查找还需要比较一轮, 确定轴心来划分数组

所以为

O = sum(N + N/2 + N/4 + N/8 + ...)

等比数列求和
Sn = a1(1 - q^n) / (1 - q)

解得
O = 2N

下面是代码:

def _partition(array, left, right):
    pivot = array[left]
    while left < right:
        while (left < right) & (pivot <= array[right]):
            right -= 1
        if left < right:
            array[left] = array[right]
        while (left < right) & (array[left] <= pivot):
            left += 1
        if left < right:
            array[right] = array[left]

    array[left] = pivot
    return left


def _quick_sort_find_kth(array, left, right, k):
    if left < right:
        pivot = _partition(array, left, right)
        if k < pivot:
            _quick_sort_find_kth(array, left, pivot - 1, k)
        elif k > pivot:
            _quick_sort_find_kth(array, pivot + 1, right, k)


def quick_sort_find_kth(array, k):
    if (k < 0) | (k > len(array) - 1):
        return None
    _quick_sort_find_kth(array, 0, len(array) - 1, k)

    return array[k]


if __name__ == '__main__':
    import random

    a = [random.randint(0, 100) for x in range(10)]
    print(a)
    print(quick_sort_find_kth(a, 0))
    print(sorted(a))

你可能感兴趣的:(快排查找第k大的数)