1.1.1. 一、快速排序法的思路:
快速排序法的示意图如下:
说明:上面的图中,是把数组[2,10,8,22,34,5,12,28,21,11]进行排序。步骤如下:
1、选取任意一个元素(这里选11),比11小的元素放在左边,比11大的放在右边。形成2个数组。
2、对新的2个数组,也执行第1步的操作。选任意一个元素,比这个元素小放在左边,比这个元素大放在右边。
3、当所有的数组都只有一个元素时,排序完成。
快速排序可以用递归实现。
1.1.2. 二、代码实现如下:
//1. left 表示 数组左边的下标
//2. right 表示数组右边的下标
//3 array 表示要排序的数组
func QuickSort(left int, right int, array *[9]int) {
l := left
r := right
pivot := array[(left+right)/2] // pivot 是中轴, 支点
temp := 0
//for 循环的目标是将比 pivot 小的数放到 左边,比 pivot 大的数放到 右边
for ; l < r; {
for ; array[l] < pivot; { //从pivot 的左边找到大于等于 pivot 的值
l++
}
for ; array[r] > pivot; { //从pivot 的右边边找到小于等于 pivot 的值
r--
}
// 1 >= r 表明本次分解任务完成
if l >= r {
break
}
//交换
temp = array[l]
array[l] = array[r]
array[r] = temp
//优化
if array[l] == pivot {
r--
}
if array[r] == pivot {
l++
}
}
// 如果 1== r, 再移动下
if l == r {
l++
r--
}
// 向左递归
if left < r {
QuickSort(left, r, array)
}
// 向右递归
if right > l {
QuickSort(l, right, array)
}
}
说明:是在一个数组内实现排序。没有增加新的数组。注意几点:
1、
pivot := array[(left+right)/2]
这个就是随意找一个数。提供比较的元素。2、从pivot的左边找到大于等于 pivot 的值,从pivot 的右边边找到小于等于 pivot 的值。找到之后把他们的下标交换,给他们交换位置。
for ; array[l] < pivot; { //从pivot 的左边找到大于等于 pivot 的值 l++ } for ; array[r] > pivot; { //从pivot 的右边边找到小于等于 pivot 的值 r-- }
3、向pivot 的左边和右边使用递归。