快速排序:在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。
复杂度:期望时间 O(n log n) , 最坏情况O(n2)
1
#include <stdio.h>
2
#include <cstdlib>
3
4
#define TOTAL_NUM 10
5
#define MAX_NUM 100
6
7
int quick(int sort[],int iLit,int iHig)
8

{
9
int ival = sort[iLit];
10
while (iLit<iHig)
11
{
12
while(iLit<iHig&&sort[iHig]>ival)iHig--;
13
sort[iLit] = sort[iHig];
14
15
while(iLit<iHig&&sort[iLit]<ival)iLit++;
16
sort[iHig] = sort[iLit];
17
}
18
sort[iLit] = ival;
19
return iLit;
20
}
21
22
void SORT(int sort[],int iLit,int iHig)
23

{
24
int iMid = 0;
25
if (iLit<iHig)
26
{
27
iMid = quick(sort,iLit,iHig);
28
SORT(sort,iLit,iMid-1);
29
SORT(sort,iMid+1,iHig);
30
}
31
}
32
33
int main(int argc,char* argv[])
34

{
35
int Sort[TOTAL_NUM];
36
37
int iPrintCount = 0;
38
int i = 0;
39
printf("::: old order ::: \n");
40
for (i=0;i<TOTAL_NUM;i++)
41
{
42
Sort[i] = (rand()+MAX_NUM)%MAX_NUM;
43
printf("%5ld ",Sort[i]);
44
if(++iPrintCount==10)
45
{
46
iPrintCount = 0;
47
printf("\n");
48
}
49
}
50
51
//quick sort
52
SORT(Sort,0,TOTAL_NUM-1);
53
54
iPrintCount = 0;
55
printf("\n::: new order ::: \n");
56
for (i=0;i<TOTAL_NUM;i++)
57
{
58
printf("%5ld ",Sort[i]);
59
if(++iPrintCount==10)
60
{
61
iPrintCount = 0;
62
printf("\n");
63
}
64
}
65
66
getchar();
67
return 0;
68
}