怎么选取基准pivot:
1.选择第一个元素作为基准
2.随机选择一个元素作为基准
快速排序的平均时间复杂度是O(nlogn),最快情况下的时间复杂度是O(n^2)(有序情况)
def partition(list, s, t):
temp = list[s]#挖坑发,把第一个位置置空
while s < t:
while s<t and temp<=list[t]:#找到右边第一个小于temp的数,停止
t -= 1
list[s] = list[t]
while s<t and temp>=list[s]:#找到左边第一个大于temp的数,停止
s += 1
list[t] = list[s]
list[s] = temp
return s
def quicksort(list, s, t):
if s >= t:
return list
else:##这里不是while
i = partition(list, s, t)
quicksort(list, s, i-1)
quicksort(list, i+1, t)
return list
print(quicksort([3,2,1,4],0,3))
快速排序扩展题:
第k大元素:
class Solution:
def findKthLargest(self, nums, k: int) -> int:
self._k = len(nums) - k # 0,1,2,3,4, 第2大数是3,3的位置是5-2=3
return self.quicksort(nums, 0, len(nums) - 1)
def quicksort(self, nums, left, right):
if left == right:
return nums[left]
pivot = self.partition(nums, left, right)
if pivot == self._k:
return nums[pivot]
elif pivot < self._k:
return self.quicksort(nums, pivot + 1, right)
else:
return self.quicksort(nums, left, pivot - 1)
def partition(self, nums, left, right): # 挖坑法
pivot = nums[left]
i, j = left, right
while i < j:
while i < j and nums[j] >= pivot: # 找到第一个比pivot小的数
j -= 1
if i < j:
nums[i] = nums[j]
i += 1
while i < j and nums[i] <= pivot:
i += 1
if i < j:
nums[j] = nums[i]
j -= 1
nums[i] = pivot
return i
print(Solution().findKthLargest([0,1,2,3,4],1))