方法其实很简单:分别从初始序列“6 1 2 7 9 3 4 5 10 8”两端开始“探测”。先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们。这里可以用两个变量i和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”。刚开始的时候让哨兵i指向序列的最左边(即i=1),指向数字6。让哨兵j指向序列的最右边(即j=10),指向数字8。
现在交换哨兵i和哨兵j所指向的元素的值。交换之后的序列如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
#include <stdio.h> int a[101],n; //定义全局变量,这两个变量需要在子函数中使用 void quicksort( int left, int right) { int i,j,t,temp; if (left>right) return ; temp=a[left]; //temp中存的就是基准数 i=left; j=right; while (i!=j) { //顺序很重要,要先从右边开始找 while (a[j]>=temp && i<j) j--; //再找右边的 while (a[i]<=temp && i<j) i++; //交换两个数在数组中的位置 if (i<j) { t=a[i]; a[i]=a[j]; a[j]=t; } } //最终将基准数归位 a[left]=a[i]; a[i]=temp; quicksort(left,i-1); //继续处理左边的,这里是一个递归的过程 quicksort(i+1,right); //继续处理右边的 ,这里是一个递归的过程 } int main() { int i,j,t; //读入数据 scanf ( "%d" ,&n); for (i=1;i<=n;i++) scanf ( "%d" ,&a[i]); quicksort(1,n); //快速排序调用 //输出排序后的结果 for (i=1;i<=n;i++) printf ( "%d " ,a[i]); getchar (); getchar (); return 0; } |
1061279345108
12345678910
1
2
3
4
5
6
7
8
9
10
11
|
1 2 7 9 3 4 5 10 8 1 2 5 4 6 9 7 10 8 1 3 5 4 6 9 7 10 8 2 3 5 4 6 9 7 10 8 2 3 5 4 6 9 7 10 8 2 3 4 5 6 9 7 10 8 2 3 4 5 6 9 7 10 8 2 3 4 5 6 8 7 9 10 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 |
快速排序由 C. A. R. Hoare(东尼霍尔,Charles Antony Richard Hoare)在1960年提出,之后又有许多人做了进一步的优化。如果你对快速排序感兴趣可以去看看东尼霍尔1962年在Computer Journal发表的论文“Quicksort”以及《算法导论》的第七章。快速排序算法仅仅是东尼霍尔在计算机领域才能的第一次显露,后来他受到了老板的赏识和重用,公司希望他为新机器设计一个新的高级语言。你要知道当时还没有PASCAL或者C语言这些高级的东东。后来东尼霍尔参加了由Edsger Wybe Dijkstra(1972年图灵奖得主,这个大神我们后面还会遇到的到时候再细聊)举办的“ALGOL 60”培训班,他觉得自己与其没有把握去设计一个新的语言,还不如对现有的“ALGOL 60”进行改进,使之能在公司的新机器上使用。于是他便设计了“ALGOL 60”的一个子集版本。这个版本在执行效率和可靠性上都在当时“ALGOL 60”的各种版本中首屈一指,因此东尼霍尔受到了国际学术界的重视。后来他在“ALGOL X”的设计中还发明了大家熟知的“case”语句,后来也被各种高级语言广泛采用,比如PASCAL、C、Java语言等等。当然,东尼霍尔在计算机领域的贡献还有很多很多,他在1980年获得了图灵奖。