QuickSort(go)

67 阅读1分钟

先放一张总结图,多看多记,形成突触。 image.png

基本实现
func QuickSort(nums []int) { //取巧的写法
    if len(nums)<=1 {
        return
    }
    left, right, pivot := 0, len(nums)-1, nums[0]
    for left < right {
        for left < right && nums[right]>pivot {
            right--
        }
        if left<right {
            nums[right], nums[left] = nums[left], nums[right]
            left++
        }
        for left<right && nums[left]<piovt {
            left++
        }
        if left<right {
            nums[right], nums[left] = nums[left], nums[right]
            right--
        }      
    } 
    QuickSort(nums[left+1:])
    QuickSort(nums[:left])
}
相关题目

从无序数组中获取第k大的数

对于本题而言,我们只需要确定第k大元素的位置position,我们只需要确保position左边的元素都比它小,position右边的元素都比它大即可,不需要关心其左边和右边的集合是否有序(直接优化快排过程,有些细节需要注意)

func findKthLargest(nums []int, k int) int {//题目处理逻辑
    toK := len(nums)-k
    ToKSplit(nums, tK, 0, len(nums)-1)
    return nums[toK]
}
func Parition(nums []int, left, right int)int{//快排一次,返回position 
    if left >= right{
        return -1
    }
    pivot := nums[left]
    for left < right{
        for  left < right && nums[right] >= pivot{
            right--
        }
        nums[left], nums[right] = nums[right], nums[left]
        for  left < right && nums[left] < pivot{
            left++
        }
        nums[left], nums[right] = nums[right], nums[left]
    }
    return left
}
func ToKSplit(nums []int, k, left, right int){
    if left < right{
        index := Parition(nums, left, right)
        if index == k{
            return
        }else if index < k{
            ToKSplit(nums, k, index+1, stop)
        }else{
            ToKSplit(nums, k, start, index-1)
        }
    }
}