快速排序的过程:
1.选基准数。
2. j 从右端遍历,寻找比基准数小的数。
3. i 从左端遍历,寻找比基准数大的数。
4. 交换两数的位置,j 沿原位置继续向左寻找,i 继续向右寻找,然后交换位置。
5. 当i = j 时,将 i 位置的数与基准数交换位置,第一次交换结束。
6. 以上次结束的位置为界,将原数列分为左右两个数列分别从1开始递归执行。
7. 递归结束的条件是 i > j。
以下以“ 6 1 2 7 9 3 4 5 10 8”十个数为例说明快速排序的过程。
首先选取6为基准数,i,j 从两端开始遍历,如下图。
当 j 找到5的位置,i 找到7的位置时,两数交换位置。
在5与7交换后,j、i 分别继续寻找,当 j 找到4的位置,i 找到9的位置时两数交换。
当4与9交换后,j、i 继续寻找时出现了j = i,此时将基准数6与3交换。
在6与3交换结束后,6已经归位,接下来的排序中6不需再参与,此时将数列以6为中介分为左右两部分,分别重复以上步骤。
以左端部分为例继续排序,右端也是如此。
当 j = i 时,2与3交换。
交换后3已归位,以3为中介继续切分数列。
排序过程均为以上过程的重复操作,在此不再赘述,源程序如下:
#include <stdio.h> int a[20]={6,1,2,7,9,3,4,5,10,8,0}, 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; n = 10; quicksort(0,n); //输出排序结果 for(i=0;i<=n;i++) printf("%d ",a[i]); return 0; }
参考博文:http://ahalei.blog.51cto.com/4767671/1365285