package main

// 快速排序
func main() {
	var a = []int{29, 10, 14, 37, 25, 18, 30} // 创建数组的简写声明
	Quick(a, 0, len(a)-1)

	for _, i2 := range a {
		print(i2, "\t") // 输出每一个值
	}
}

/**
Quick 实现快速排序 O(n * log(n))
	a : 被排序数组
	返回:排序完毕数组
*/
func Quick(slice []int, left, right int) {
	if left < right {
		mid := partition(slice, left, right) // 获取归位中值
		Quick(slice, left, mid-1)            // 操作 中值 左边数组
		Quick(slice, mid+1, right)           // 操作 中值 右边数组
	}
}

/**
partition 归位函数,获取一个关于某值对称的数组
*/
func partition(slice []int, left, right int) int {
	tmp := slice[left] // 获取左侧第一个数
	for left < right {
		// 进行逐个实现归位操作,将列表形成一个对称列表
		// 左边比 tmp 大的数,调至右边
		for left < right && slice[right] >= tmp {
			right--
		}
		slice[left] = slice[right]

		// 右边比 tmp 小的数,调至左边
		for left < right && slice[left] <= tmp {
			left++
		}
		slice[right] = slice[left]
	}
	slice[left] = tmp
	return left
}