快速排序
通过一趟排序将待排序记录划分(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: |
| |
| |
| 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) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)