[算法初步]之快速排序 ##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() }