leetcode-快速排序
快速排序
通过一趟排序将待排序记录划分(partition)成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可以分别对着两部分记录继续进行排序,以达到整个序列有序。
代码实现
def quicksort(nums,left,right):
if left>=right: return
def partition(nums,left,right):
pivot = nums[left]
i,j=left,right
while i<j:
while i<j and nums[j]>=pivot:
j-=1
while i<j and nums[i]<=pivot:
i+=1
nums[i],nums[j] = nums[j],nums[i]
nums[i],nums[left] = nums[left],nums[i]
return i
p = partition(nums,left,right)
quicksort(nums,left,p-1)
quicksort(nums,p+1,right)
快排-topk问题
- 第k小的数
def topk(nums,k):
def quicksort(nums,left,right):
pivot = nums[left]
i,j=left,right
while i<j:
while i<j and nums[j]>=pivot:
j-=1
while i<j and nums[i]<=pivot:
i+=1
nums[i],nums[j] = nums[j],nums[i]
nums[i],nums[left] = nums[left],nums[i]
if k<i:
return quicksort(nums,left,i-1)
if k>i:
return quicksort(nums,i+1,right)
return nums[k-1]
return quicksort(nums,0,len(nums)-1)
- 第k大的数
class Solution:
def findKth(self , a: List[int], n: int, K: int) -> int:
# write code here
def quicksort(a,left,right):
pivot = a[left]
i,j = left,right
while i<j:
while i<j and a[j]>=pivot:
j-=1
while i<j and a[i]<=pivot:
i+=1
a[i],a[j]=a[j],a[i]
a[i],a[left]= a[left],a[i]
if i==n-K:
return a[i]
elif i<n-K:
return quicksort(a,i+1,right)
else:
return quicksort(a,left,i-1)
return quicksort(a,0,n-1)