Skip to content

Instantly share code, notes, and snippets.

@weedsx
Created May 2, 2024 14:26
Show Gist options
  • Save weedsx/d50b56c48f850323ba9ea52c7df9eef7 to your computer and use it in GitHub Desktop.
Save weedsx/d50b56c48f850323ba9ea52c7df9eef7 to your computer and use it in GitHub Desktop.
随机快速排序 O(n * logn)
package sort
import "math/rand"
// QuickSort 随机快速排序改进版,时间复杂度收敛至 O(n * logn)
func QuickSort(arr []int) []int {
var first, last int
// 已知arr[l....r]范围上一定有x这个值
// 划分数组 小于x放左边,等于x放中间,大于x放右边
// 把全局变量first, last,更新成等于x区域的左右边界
partition := func(arr []int, l, r, x int) {
first, last = l, r
i := l
for i <= last {
if arr[i] == x {
i++
} else if arr[i] < x {
arr[first], arr[i] = arr[i], arr[first]
i++
first++
} else {
arr[last], arr[i] = arr[i], arr[last]
last--
}
}
}
var recursion func(arr []int, l, r int)
recursion = func(arr []int, l, r int) {
if l >= r {
return
}
// 此处随机能在概率上把快速排序的时间复杂度收敛到O(n * logn)
x := arr[l+rand.Intn(r-l+1)]
partition(arr, l, r, x)
left, right := first, last
recursion(arr, l, left-1)
recursion(arr, right+1, r)
}
if len(arr) > 1 {
recursion(arr, 0, len(arr)-1)
}
return arr
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment