Hoare版本:
HOARE-PARTITION(A, p, r)
1 x ← A[p] //以第一个元素为主元
2 i ← p - 1
3 j ← r + 1
4 while TRUE
5 do repeat j ← j - 1
6 until A[j] ≤ x
7 repeat i ← i + 1
8 until A[i] ≥ x
9 if i < j
10 then exchange A[i] ↔ A[j]
11 else return j
优化后的算法导论上的版本:
PARTITION(A, p, r)
1 x ← A[r] //以最后一个元素,A[r]为主元
2 i ← p - 1
3 for j ← p to r - 1
4 do if A[j] ≤ x
5 then i ← i + 1
6 exchange A[i] <-> A[j]
7 exchange A[i + 1] <-> A[r]
8 return i + 1
咱们,先举上述说明Hoare版本的这个例子,对序列3 8 7 1 2 5 6 4,进行排序:
Hoare版本(以3为主元,红体为主元):
3 8 7 1 2 5 6 4
2 8 7 1 5 6 4 //交换1次,比较4次
2 7 1 8 5 6 4 //交换1次,比较1次
2 1 7 8 5 6 4 //交换1次,比较1次
2 1 7 8 5 6 4 //交换1次,比较0次
2 1 3 7 8 5 6 4 //总计交换4次,比较6次。
//移动了元素3、8、7、1、2.移动范围为:2+3+1+2+4=12.
优化版本(以4为主元):
3 8 7 1 2 5 6 4 //3与3交换,不用移动元素,比较1次
3 1 7 8 2 5 6 4 //交换1次,比较3次
3 1 2 8 7 5 6 4 //交换1次,比较1次
3 1 2 4 7 5 6 8 //交换1次,比较2次。
//即完成,总计交换4次,比较7次。
//移动了元素8、7、1、2、4.移动范围为:6+2+2+2+4=16.
再举一个例子:对序列2 8 7 1 3 5 6 4排序:
Hoare版本:
2 8 7 1 3 5 6 4
1 8 7 3 5 6 4 //交换1次,比较5次
1 7 8 3 5 6 4 //交换1次,比较1次
1 2 7 8 3 5 6 4 //交换0次,比较1次。2填上,完成,总计交换2次,比较7次。
优化版本:
2 8 7 1 3 5 6 4 //2与2交换,比较1次
2 1 7 8 3 5 6 4 //交换1次,比较3次
2 1 3 8 7 5 6 4 //交换1次,比较1次
2 1 3 4 7 5 6 8 //交换1次,比较2次。完成,总计交换4次,比较7次。
更多 :http://www.cnblogs.com/v-July-v/archive/2011/02/27/1983671.html