冒泡排序
BubbleSort ( T* d, const int n) {
T temp;
for ( int i= 0 ; i< n- 1 ; i++ )
for ( int j= 0 ; j< n- 1 - i; j++ ) {
if ( ! comp ( d[ j] , d[ j+ 1 ] ) ) {
temp = d[ j] ;
d[ j] = d[ j+ 1 ] ;
d[ j+ 1 ] = temp;
}
}
}
直接选择
SelectSort ( T* d, const int n) {
for ( int i = 0 ; i < n - 1 ; i++ ) {
int min = i;
for ( int j = i + 1 ; j < n; j++ )
if ( comp ( d[ j] , d[ min] ) )
min = j;
swap ( & d[ min] , & d[ i] ) ;
}
直接插入
void InsertSort ( T* d, const int n) {
for ( int i= 1 ; i< n; i++ ) {
int k= i- 1 ;
T a= d[ i] ;
while ( k>= 0 && comp ( a, d[ k] ) ) {
d[ k+ 1 ] = d[ k] ;
k-- ;
}
d[ k+ 1 ] = a;
}
}
堆排序
HeapAdjust ( T* d, int left, int right) {
T a= d[ left] ;
for ( int j= 2 * left+ 1 ; j<= right; j= 2 * j+ 1 ) {
if ( j< right&& comp ( d[ j] , d[ j+ 1 ] ) ) j++ ;
if ( comp ( d[ j] , a) ) break ;
d[ left] = d[ j] ;
left= j;
}
d[ left] = a;
}
void HeapSort ( T* d, const int n) {
for ( int i= n/ 2 - 1 ; i>= 0 ; i-- ) HeapAdjust ( d, i, n- 1 ) ;
for ( int i= n- 1 ; i> 0 ; i-- ) {
swap ( d[ 0 ] , d[ i] ) ;
HeapAdjust ( d, 0 , i- 1 ) ;
}
}
希尔排序
void ShellSort ( T* d, const int n) {
int h= 1 ;
while ( h< n/ 3 ) h= h* 3 + 1 ;
while ( h> 0 )
{
for ( int i= h; i< n; i++ ) {
int j= i- h;
T a= d[ i] ;
while ( j>= 0 && comp ( a, d[ j] ) ) {
d[ j+ h] = d[ j] ;
j- = h;
}
d[ j+ h] = a;
}
h= h/ 3 ;
}
}
二路归并排序
void MergeSort ( T* d, const int n) {
int size= 1 , left, mid, right;
T * w= new T[ n] ;
while ( size< n) {
left= 0 ;
while ( left+ size< n) {
mid= left+ size- 1 ;
right= mid+ size;
if ( right>= n) right= n- 1 ;
Merge ( d, w, left, mid, right) ;
left= right+ 1 ;
}
size* = 2 ;
}
delete[ ] w;
}
void Merge ( T* d, T* w, int left, int mid, int right) {
int i= left;
int j= mid+ 1 ;
int k= left;
while ( k<= right) {
if ( i> mid) w[ k++ ] = d[ j++ ] ;
else if ( j> right) w[ k++ ] = d[ i++ ] ;
else {
if ( comp ( d[ j] , d[ i] ) ) w[ k++ ] = d[ j++ ] ;
else w[ k++ ] = d[ i++ ] ;
}
}
for ( int k= left; k<= right; k++ ) d[ k] = w[ k] ;
}
快速排序
void QuickSort ( T* d, const int n) {
if ( n<= 1 ) return ;
const int M= 7 , NSTACK= 128 ;
int i, j, k, jstack= - 1 , left= 0 , mid, right= n- 1 ;
int istack[ NSTACK] ;
while ( true) {
if ( right- left< M)
{
for ( j= left+ 1 ; j<= right; j++ ) {
T a= d[ j] ;
for ( i= j- 1 ; i>= left&& comp ( a, d[ i] ) ; i-- ) d[ i+ 1 ] = d[ i] ;
d[ i+ 1 ] = a;
}
if ( jstack< 0 ) break ;
right= istack[ jstack-- ] ;
left= istack[ jstack-- ] ;
} else
{
i= left+ 1 ;
j= right;
k= i;
mid= ( left+ right) / 2 ;
swap ( d[ mid] , d[ k] ) ;
if ( comp ( d[ right] , d[ left] ) ) swap ( d[ left] , d[ right] ) ;
if ( comp ( d[ right] , d[ k] ) )
swap ( d[ k] , d[ right] ) ;
if ( comp ( d[ k] , d[ left] ) )
swap ( d[ left] , d[ k] ) ;
while ( true) {
do j-- ;
while ( comp ( d[ k] , d[ j] ) ) ;
do i++ ;
while ( comp ( d[ i] , d[ k] ) ) ;
if ( j< i) break ;
swap ( d[ i] , d[ j] ) ;
}
swap ( d[ j] , d[ k] ) ;
jstack+ = 2 ;
if ( right- i+ 1 >= j- left) {
istack[ jstack- 1 ] = i;
istack[ jstack] = right;
right= j- 1 ;
} else
{
istack[ jstack- 1 ] = left;
istack[ jstack] = j- 1 ;
left= i;
}
}
}
}