介绍
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
示意图

递归的三大要素
第一要素:明确你这个函数想要干什么
第二要素:寻找递归结束条件
第三要素:找出函数的等价关系式
快排基本思想
- 选定Pivot中心轴
- 将大于Pivot的数字放在Pivot的右边
- 将小于Pivot的数字放在Pivot的左边
- 分别对左右子序列重复前三步操作
- 左递归
- 右递归
选取中轴 pivot(这里取首元素), left 指向第一个元素下标, right 指向最后一个元素下标,
如果 arr[right] >= pivot ,则 right—
如果 arr[right] < pivot ,则 arr[left] = arr[right] ,left++
如果 arr[left] <= pivot ,则 left++
如果 arr[left] > pivot ,则 arr[right] = arr[left] , right—
代码
// 快速排序package mainimport ("fmt")func quickSort(left int, right int, arr *[8]int) {// 保留 左右下标值,不参与运算, 只用来传递参数,定义运算边界,划分子问题L := left // 值拷贝R := right// 递归结束条件if left >= right {return}// 中轴pivot := arr[left]// 从小到大排for left < right {for left < right && arr[right] >= pivot {right--}if left < right {arr[left] = arr[right] // 移动值}for left < right && arr[left] <= pivot {left++}if left < right {arr[right] = arr[left]}if left >= right {arr[left] = pivot}}fmt.Println(left, right, arr)// 划分子问题// 左递归quickSort(L, right-1, arr)// 右递归quickSort(right+1, R, arr)}func main() {// arr := [6]int{-9, 78, 0, 23, -567, 70}arr := [8]int{5, 8, 1, 3, 6, 2, 4, 7}fmt.Println("arr = ", arr)quickSort(0, len(arr)-1, &arr)fmt.Println("arr = ", arr)}/*arr = [5 8 1 3 6 2 4 7]4 4 &[4 2 1 3 5 6 8 7]3 3 &[3 2 1 4 5 6 8 7]2 2 &[1 2 3 4 5 6 8 7]0 0 &[1 2 3 4 5 6 8 7]5 5 &[1 2 3 4 5 6 8 7]7 7 &[1 2 3 4 5 6 7 8]arr = [1 2 3 4 5 6 7 8]*/
