// 快速排序
// 左边遇到跟中轴相等的情况,需要右边下标左移动,因为需要保证从这个点到中轴之间的顺序。如果,左边右移的话,可能导致这个位置顺序不对。
func QuickSort(left int, right int, array []int) {
if left >= right {
return
}
l := left
r := right
pivot := array[(left+right)/2]
for l < r {
//从 pivot 的左边找到大于等于pivot的值
for array[l] < pivot { // 相等的话,也准备交换「有可能需要跟左半部分的其他值交换」
l++
}
//从 pivot 的右边边找到小于等于pivot的值
for array[r] > pivot { // 同理
r--
}
// 交换
array[l], array[r] = array[r], array[l] // // 左右刚交互,所以右边的不可能比中轴还小。所以下面的r--不会有问题。
if array[l] == pivot { // 精髓部分:左边有个跟中轴相等的情况,需要右边下标左移。「因为需要去排左半部分」
r--
}
}
// 每次递归的时候,不能带下标为l的,否则就死循环了。「只能一次比一次少,如果都一样的话,就没结束的时候了」
QuickSort(left, l-1, array)
QuickSort(l+1, right, array)
}