快速排序算法
已知数组int[] dec={0,5,2,9,7,4,3};用快速排序算法按升序对其进行排列,并返回数组
算法过程
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一躺快速排序的算法是:
1)设置两个变量I、J,排序开始的时候:I=1,J=N;
2)以第一个数组元素作为关键数据,赋值给X,即 X=A[1];
3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于X的值,让该值与X交换;
4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于X的值,让该值与X交换;
5)重复第3、4步,直到 I=J;
1 #include <iostream>
2
3 using namespace std;
4
5 int partition(int a[],int i,int j)
6 {
7 int X = a[i]; //用区间的第1个记录作为基准
8 while(i < j) //从区间两端交替向中间扫描,直到i=j为止
9 {
10 while(i<j&&a[j]>=X) //X相当于在位置i上
11 j--; //从右向左扫描,查到第1个关键字小于X的记录a[j]
12 if(i < j) //表示找到的关键字小于X
13 a[i++] = a[j]; //相当于交换a[i]和a[j]
14
15 while(i<j&&a[i]<=X)
16 i++;
17 if(i < j)
18 a[j--] = a[i];
19 } //endwhile
20 a[i] = X; //基准记录已被最后定位
21 return i;
22 }
23
24 void QuickSort(int a[],int low,int high)
25 {
26 int pivotpos; //划分后的基准记录的位置
27 if(low < high) //仅当区间长度大于1时才排序
28 {
29 pivotpos = partition(a,low,high); //做划分
30 QuickSort(a,low,pivotpos-1);
31 QuickSort(a,pivotpos+1,high);
32 }
33 }
34
35 void printArray(int a[],int n)
36 {
37 int i = 0;
38 for(i = 0;i < n;i++)
39 cout<<a[i]<<" ";
40 cout<<endl;
41 }
42
43 int main(void)
44 {
45 int dec[] = {0,5,2,9,7,4,3};
46 QuickSort(dec,0,6);
47 printArray(dec,7);
48 return 0;
49 }