快排查找第k大的数
2018-03-26 本文已影响224人
wangke
时间复杂度
时间复杂度与二分查找很相似, 都是只找一边. 但是快排不平衡, 且快排需要计算轴心位置.
二分查找的时间复杂度

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))