[算法初步]之快速排序

[算法初步]之快速排序

##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()
	}

	
posted @ 2013-04-22 20:13  零界寒冰  阅读(150)  评论(0编辑  收藏  举报