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问题

  1. 第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)
  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)
posted @   topbookcc  阅读(119)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
/* 鼠标点击求赞文字特效 */
点击右上角即可分享
微信分享提示