- void shellsort( vector<int> & a )
- {
- for( int gap = a.size( ) / 2; gap > 0; gap /= 2 )
- for( int i = gap; i < a.size( ); i++ )
- {
- int tmp = a[ i ];
- int j = i;
- for( ; j >= gap && tmp < a[ j - gap ]; j -= gap )
- a[ j ] = a[ j - gap ];
- a[ j ] = tmp;
- }
- }
- //堆排序
- inline int leftChild( int i )
- {
- return 2 * i + 1;
- }
- void percDown( vector<int> & a, int i, int n )
- {
- int child;
- int tmp;
- for( tmp = a[ i ]; leftChild( i ) < n; i = child )
- {
- child = leftChild( i );
- if( child != n - 1 && a[ child ] < a[ child + 1 ] )
- child++;
- if( tmp < a[ child ] )
- a[ i ] = a[ child ];
- else
- break;
- }
- a[ i ] = tmp;
- }
- void heapsort( vector<int> & a )
- {
- for( int i = a.size( ) / 2; i >= 0; i-- )
- percDown( a, i, a.size( ) );
- for( int j = a.size( ) - 1; j > 0; j-- )
- {
- swap( a[ 0 ], a[ j ] );
- percDown( a, 0, j );
- }
- }
- //归并排序
- void merge( vector<int> & a, vector<int> & tmpArray,
- int leftPos, int rightPos, int rightEnd )
- {
- int leftEnd = rightPos - 1;
- int tmpPos = leftPos;
- int numElements = rightEnd - leftPos + 1;
- while( leftPos <= leftEnd && rightPos <= rightEnd )
- if( a[ leftPos ] <= a[ rightPos ] )
- tmpArray[ tmpPos++ ] = a[ leftPos++ ];
- else
- tmpArray[ tmpPos++ ] = a[ rightPos++ ];
- while( leftPos <= leftEnd )
- tmpArray[ tmpPos++ ] = a[ leftPos++ ];
- while( rightPos <= rightEnd )
- tmpArray[ tmpPos++ ] = a[ rightPos++ ];
- for( int i = 0; i < numElements; i++, rightEnd-- )
- a[ rightEnd ] = tmpArray[ rightEnd ];
- }
- void mergesort(vector<int> & a,vector<int> &tmpArray,int left,int right)
- {
- if ( left < right )
- {
- int center = ( left+right ) / 2;
- mergesort( a, tmpArray, left, center);
- mergesort( a, tmpArray, center+1, right);
- merge( a, tmpArray, left, center+1, right);
- }
- }
- void mergesort( vector<int> & a )
- {
- vector<int> tmpArray( a.size() );
- mergesort( a, tmpArray, 0, a.size()-1 );
- }
- //快速排序
- const int & median3( vector<int> & a, int left, int right )
- {
- int center = ( left + right ) / 2;
- if( a[ center ] < a[ left ] )
- swap( a[ left ], a[ center ] );
- if( a[ right ] < a[ left ] )
- swap( a[ left ], a[ right ] );
- if( a[ right ] < a[ center ] )
- swap( a[ center ], a[ right ] );
- // Place pivot at position right - 1
- swap( a[ center ], a[ right - 1 ] );
- return a[ right - 1 ];
- }
- void insertionSort( vector<int> & a,int left,int right )
- {
- int j;
- for( int p=left; p<right; p++)
- {
- int tmp = a[ p ];
- for( j=p; j>0 && tmp<a[ j-1 ]; j--)
- a[ j ]=a[ j-1 ];
- a[ j ] = tmp;
- }
- }
- void quicksort( vector<int> & a, int left, int right )
- {
- if( left + 10 <= right )
- {
- int pivot = median3( a, left, right );
- // Begin partitioning
- int i = left, j = right - 1;
- for( ; ; )
- {
- while( a[ ++i ] < pivot ) { }
- while( pivot < a[ --j ] ) { }
- if( i < j )
- swap( a[ i ], a[ j ] );
- else
- break;
- }
- swap( a[ i ], a[ right - 1 ] );
- quicksort( a, left, i - 1 );
- quicksort( a, i + 1, right );
- }
- else
- insertionSort( a, left, right );
- }
- void quicksort( vector<int> & a )
- {
- quicksort( a, 0, a.size( ) - 1 );
- }