排序——快速排序(QuickSort)

来源:互联网 发布:淘宝蓝钻cdk没有了 编辑:程序博客网 时间:2024/04/30 08:44
 

有些东西再不贴出来,以后可能再也找不到了。陆续整理曾写过的排序算法。

 

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

原理不多做介绍了,有需要可以看看这里:

http://www.hiahia.org/datastructure/paixu/paixu8.3.2.1-1.htm

 

上代码:

view plaincopy to clipboardprint?
  1. const int NUM=20;  
  2.   
  3. int arr[] = {1,10,11,5,6,15,0,15,16,14,0,8,17,15,7,19,17,1,18,7};  
  4.   
  5. /* swap函数:交换v[k]与v[j]的值 */  
  6. inline void swap(int v[], int k, int j)  
  7. {  
  8.     int temp;  
  9.     temp = v[k];  
  10.     v[k] = v[j];  
  11.     v[j] = temp;  
  12. }  
  13.   
  14. void qsort(int v[], int left, int right)  
  15. {  
  16.     int j, left_c,right_c,sigh;  
  17.     left_c=left;              //当前一趟快排的最左序号  
  18.     right_c=right;            //当前一趟快排的最右序号  
  19.     sigh=0;               //0表示从左边开始排  
  20.     while(left_c!=right_c)  
  21.     {  
  22.         if(v[left_c]<v[right_c])                  //搜索可以交换的位置                 
  23.         {  
  24.             if(sigh==0)             
  25.                 --right_c;  
  26.             else  
  27.                 ++left_c;  
  28.             continue;  
  29.         }  
  30.         if(sigh==0)                         //小头有空,交换  
  31.         {  
  32.             swap(v,left_c++,right_c);  
  33.             sigh=1;  
  34.         }  
  35.         else                              //大头有空,交换  
  36.         {  
  37.             swap(v,left_c,right_c--);  
  38.             sigh=0;  
  39.         }  
  40.     }  
  41.     for(j=0;j<NUM;++j)  
  42.         cout<<v[j]<<" ";  
  43.     cout<<endl;  
  44.     /*一次快排结束,小头和大头继续搜索*/  
  45.     if(left<left_c-1)  
  46.         qsort(v, left, left_c-1);  
  47.     if(right>right_c+1)  
  48.         qsort(v, right_c+1, right);  
  49. }  
  50.   
  51. void main()  
  52. {  
  53.     int j;  
  54.     qsort(arr, 0, NUM-1);  
  55.     for(j=0; j<NUM; j++)  
  56.         printf("%d ", arr[j]);  
  57.     printf("/n");  
  58. }  


原创粉丝点击