先放一张总结图,多看多记,形成突触。
基本实现
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)
}
}
}