排序方法小结(c++版)

 
  1. void shellsort( vector<int> & a )
  2. {
  3.     forint gap = a.size( ) / 2; gap > 0; gap /= 2 )
  4.         forint i = gap; i < a.size( ); i++ )
  5.         {
  6.             int tmp = a[ i ];
  7.             int j = i;
  8.             for( ; j >= gap && tmp < a[ j - gap ]; j -= gap )
  9.                 a[ j ] = a[ j - gap ];
  10.             a[ j ] = tmp;
  11.         }
  12. }
  13. //堆排序
  14. inline int leftChild( int i )
  15. {
  16.     return 2 * i + 1;
  17. }
  18. void percDown( vector<int> & a, int i, int n )
  19. {
  20.     int child;
  21.     int tmp;
  22.     for( tmp = a[ i ]; leftChild( i ) < n; i = child )
  23.     {
  24.         child = leftChild( i );
  25.         if( child != n - 1 && a[ child ] < a[ child + 1 ] )
  26.             child++;
  27.         if( tmp < a[ child ] )
  28.             a[ i ] = a[ child ];
  29.         else
  30.             break;
  31.     }
  32.     a[ i ] = tmp;
  33. }
  34. void heapsort( vector<int> & a )
  35. {
  36.     forint i = a.size( ) / 2; i >= 0; i-- )  
  37.         percDown( a, i, a.size( ) );
  38.     forint j = a.size( ) - 1; j > 0; j-- )
  39.     {
  40.         swap( a[ 0 ], a[ j ] );              
  41.         percDown( a, 0, j );
  42.     }
  43. }
  44. //归并排序
  45. void merge( vector<int> & a, vector<int> & tmpArray,
  46.             int leftPos, int rightPos, int rightEnd )
  47. {
  48.     int leftEnd = rightPos - 1;
  49.     int tmpPos = leftPos;
  50.     int numElements = rightEnd - leftPos + 1;
  51.     while( leftPos <= leftEnd && rightPos <= rightEnd )
  52.         if( a[ leftPos ] <= a[ rightPos ] )
  53.             tmpArray[ tmpPos++ ] = a[ leftPos++ ];
  54.         else
  55.             tmpArray[ tmpPos++ ] = a[ rightPos++ ];
  56.     while( leftPos <= leftEnd )   
  57.         tmpArray[ tmpPos++ ] = a[ leftPos++ ];
  58.     while( rightPos <= rightEnd )  
  59.         tmpArray[ tmpPos++ ] = a[ rightPos++ ];
  60.     forint i = 0; i < numElements; i++, rightEnd-- )
  61.         a[ rightEnd ] = tmpArray[ rightEnd ];
  62. }
  63. void mergesort(vector<int> & a,vector<int> &tmpArray,int left,int right)
  64. {
  65.     if ( left < right )
  66.     {
  67.      int center = ( left+right ) / 2;
  68.      mergesort( a, tmpArray, left, center);
  69.      mergesort( a, tmpArray, center+1, right);
  70.      merge( a, tmpArray, left, center+1, right);
  71.     }
  72. }
  73. void mergesort( vector<int> & a )
  74. {
  75.    vector<int> tmpArray( a.size() );
  76.    mergesort( a, tmpArray, 0, a.size()-1 );
  77. }
  78. //快速排序
  79. const int & median3( vector<int> & a, int left, int right )
  80. {
  81.     int center = ( left + right ) / 2;
  82.     if( a[ center ] < a[ left ] )
  83.         swap( a[ left ], a[ center ] );
  84.     if( a[ right ] < a[ left ] )
  85.         swap( a[ left ], a[ right ] );
  86.     if( a[ right ] < a[ center ] )
  87.         swap( a[ center ], a[ right ] );
  88.         // Place pivot at position right - 1
  89.     swap( a[ center ], a[ right - 1 ] );
  90.     return a[ right - 1 ];
  91. }
  92. void  insertionSort( vector<int> & a,int left,int right )
  93. {
  94.     int j;
  95.     forint p=left; p<right; p++)
  96.     {
  97.      int tmp = a[ p ];
  98.      for( j=p; j>0 && tmp<a[ j-1 ]; j--)
  99.          a[ j ]=a[ j-1 ];
  100.      a[ j ] = tmp;
  101.     
  102.     }
  103. }
  104. void quicksort( vector<int> & a, int left, int right )
  105. {
  106.     if( left + 10 <= right )
  107.     {
  108.         int pivot = median3( a, left, right );
  109.             // Begin partitioning
  110.         int i = left, j = right - 1;
  111.         for( ; ; )
  112.         {
  113.             while( a[ ++i ] < pivot ) { }
  114.             while( pivot < a[ --j ] ) { }
  115.             if( i < j )
  116.                 swap( a[ i ], a[ j ] );
  117.             else
  118.                 break;
  119.         }
  120.         swap( a[ i ], a[ right - 1 ] ); 
  121.         quicksort( a, left, i - 1 );    
  122.         quicksort( a, i + 1, right );    
  123.     }
  124.     else  
  125.         insertionSort( a, left, right );
  126. }
  127. void quicksort( vector<int> & a )
  128. {
  129.     quicksort( a, 0, a.size( ) - 1 );
  130. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值