//快速程序(结果递增): //算法过程是:设置数组a[left,right]中的第一个元素a[left]为主元.设置m = left, n = right + 1. //由n处从后往前找到第一个比主元小的元素;由m处从前往后找到第一个比主元大的元素;交换这两者. //交换完成后,判断m<n如果依然成立,则继续从两个方向向中间推进,寻找符合条件的元素,交换之,直至m = n,结束循环. //这一轮循环结束后(即完成了一轮快速排序),还需交换v[left]与v[m](此时m==n),以最终形成格局 ...小小小...主元...大大大... //递归过程开始,分别递归排序左边子集和右边子集. //递归出口:数组中包含的元素个数少于两个,返回. #include <stdio.h> #include <stdlib.h> #define MAXLINE 200 void swap(int &a, int &b) { int temp; temp = a; a = b; b = temp; } void quickSort(int v[], int left, int right) { int key = v[left]; //设置主元 int m = left, n = right + 1; //注意这里的m和n的取值,不这样取会出错 if(m >= n) //满足一定条件(即递归出口),函数返回 return; while (m < n) { if (v[n] > key) n--; else if (v[m] <= key) m++; swap(v[m], v[n]); } swap(v[left], v[n]); //这里等同于swap(v[left], v[m]);因为此处已经有 m == n //将主元与v[n]或者v[m]对调,实现主元左侧是较主元小的元素子集,右侧是较主元大的元素子集 //开始递归 quickSort(v, left, n-1); quickSort(v, n+1, right); } int main() { int testArray[MAXLINE]; for(int m1 = 0; m1 < MAXLINE -1 ; m1++) testArray[m1] = rand(); printf("排序之前:/n"); for(int m2 = 0; m2 < MAXLINE; m2++) printf("%d ", testArray[m2]); printf("/n"); quickSort(testArray, 0, MAXLINE - 1); printf("排序之后:/n"); for(int m3 = 0; m3 < MAXLINE; m3++) printf("%d ", testArray[m3]); printf("/n"); return 0; }