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 @ 2022-11-04 17:09  topbookcc  阅读(102)  评论(0编辑  收藏  举报
/* 鼠标点击求赞文字特效 */