[算法初步]之快速排序
##1 场景
大家有没有见过苹果装箱呢,苹果长出来的时候总是大小不一的。这个时候就需要人工挑选出来,大的装一箱,小的装一箱。这样才能卖出合理的价钱。
假如现在有一箱苹果,重量分别如下(好吧,外星球产的苹果,差别比较大。细节问题,不要关心~):
* [3, 5, 1, 7, 6, 2, 11, 13, 4]
我们决定分在个箱子里卖掉。当然要先把苹果按照制定的标准挑选出来,然后定一个统一价。
小于这个标准和大于这个标准的装在另外2个箱子里。以不同的价格卖出。我们就以左边箱子装小苹果,右边的箱子装大苹果。
下面就需要来挑拣了。
首先怎么判定大小的标准呢,这个可是没有定数的。
既然没有标准,我们默认只要你看到的第一个就是标准大小的,我们就按这个定价。然后和这个不一致的其他的苹果分在两边。
第一个苹果是3,我们就把秤定到3kg。然后来称量苹果的重量然后装箱。
* [小苹果箱][3, 5, 1, 7, 6, 2, 11, 13, 4][大苹果箱] 重量标记 3
当然了,我们准备左右开工同时来挑拣苹果。小的放左边的小箱子,大的放右边的大箱子,而标准的那个尽量放中间了。
右手边的一眼望去都是11kg, 13kg, 4kg的都是比较大的苹果,直接往箱子里面放,到2kg那个,哎小了,跟标准那个换换位置,然后就可以丢进小箱子里了。
* 小苹果箱[][3, 5, 1, 7, 6, 2][11, 13, 4] 大苹果箱 (2和3交换)
* 小苹果箱[2][ 5, 1, 7, 6, 3][11, 13, 4] 大苹果箱
这个时候左手操作跟上来了,咦5大了,跟标准那个位置换换吧,然后丢进大箱子里面吧。
* 小苹果箱[2][ 5, 1, 7, 6, 3][11, 13, 4] 大苹果箱 (3和5交换)
* 小苹果箱[2][ 3,1, 7, 6 ][5,11, 13, 4] 大苹果箱
如此继续,右左右左的开工。知道比较完了所有的苹果。结果如下
* 小苹果箱 [2, 1] 3 [ 7, 6, 5 11, 13, 4]
ok了。标准的苹果我们已经挑出来了,左边的苹果都是比这个小的小苹果,而右边都是大苹果了。
但是老板看了一眼,还是不满意。说我们为什么不分的再细一些呢。这样我们就可以按更合适的价格分别卖了。
ok,标准的那个不用动了。那么就继续对小苹果箱和大苹果箱里面的苹果分别再详细分吧。过程和前面是一样的。
这样一直到最后,当我们分的不能再分的时候。所有的大小箱的苹果也就划分好了。
* 最终结果[1,2,3,4,5,6,7,8,9]
##2 go语言代码
package main
import (
"fmt"
)
func Partition(data *[9]int, low int, high int) int {
criteria := data[low]
for low < high {
for low < high && data[high] >= criteria {
high--
}
data[low], data[high] = data[high], data[low]
for low < high && data[low] <= criteria {
low++
}
data[low], data[high] = data[high], data[low]
}
return low
}
func QuickSort(data *[9]int, low int, high int) {
if low < high {
pos := Partition(data, low, high)
QuickSort(data, low, pos-1)
QuickSort(data, pos+1, high)
}
}
func main() {
data := [9]int{3, 5, 1, 7, 6, 2, 8, 9, 4}
QuickSort(&data, 0, len(data)-1)
for i := 0; i < len(data); i++ {
fmt.Print(data[i], ",")
}
fmt.Println()
}