golang快速排序

38 阅读1分钟
// 快速排序
// 左边遇到跟中轴相等的情况,需要右边下标左移动,因为需要保证从这个点到中轴之间的顺序。如果,左边右移的话,可能导致这个位置顺序不对。
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)
}