通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序。整个排序过程可以递归进行,以此达到整个数据变成有序序列的目的

 

如无序数组[6 2 4 1 5 9]

a)先把第一项[6]取出来;

用[6]依次与其余项进行比较;

如果比[6]小就放[6]前边,2 4 1 5都比[6]小,所以全部放到[6]前边;

如果比[6]大就放[6]后边,9比[6]大,放到[6]后边。

一趟排完后:

排序前 6 2 4 1 5 9

排序后 2 4 1 5 6 9

b)对前半部分[2 4 1 5]继续进行快速排序

重复步骤a)后变成:

排序前 2 4 1 5

排序后 1 2 4 5

前半部分排序完成,总的排序也完成:

排序前:[6 2 4 1 5 9]

排序后:[1 2 4 5 6 9]

C语言代码:

   
   
   
   
  1. #include  
  2. int main() 
  3.     int a[5]={5,4,3,2,1},i; 
  4.   
  5.     printf("原本的数字为:"); 
  6.      for(i=0;i<5;i++) 
  7.     { 
  8.         printf("%d ",a[i]); 
  9.     } 
  10.     printf("\n"); 
  11.   
  12.     void quick (int a[],int i,int j); 
  13.     quick (a,0,4); 
  14.   
  15.     printf("快速法排序后:"); 
  16.     for(i=0;i<5;i++) 
  17.     { 
  18.         printf("%d ",a[i]); 
  19.     } 
  20.     return 0; 
  21.   
  22. //快速法 
  23. void quick(int a[],int i,int j) 
  24.     int m,n,temp; 
  25.     int k; 
  26.     m=i;//i:要排数组起始元素的下标 
  27.     n=j;//j:要排数组结束元素的下标 
  28.     k=a[(1+j)/2];//选取的参照 
  29.     do 
  30.     { 
  31.         while(a[m]//从左到右找比k大的元素 
  32.         { 
  33.             m++; 
  34.         } 
  35.         while(a[n]>k&&n>i)//从右到左找比k小的元素 
  36.         { 
  37.             n--; 
  38.         } 
  39.         if (m<=n)//交换 
  40.         { 
  41.             temp=a[m]; 
  42.             a[m]=a[n]; 
  43.             a[n]=temp; 
  44.             m++; 
  45.             n--; 
  46.         } 
  47.     }while(m<=n); 
  48.     if(m
  49.     { 
  50.         quick(a,m,j);//递归调用 
  51.     } 
  52.     if(n>i) 
  53.     { 
  54.         quick(a,i,n);//递归调用 
  55.     } 

引用:http://www.cnblogs.com/kkun/archive/2011/11/23/2260270.html