O(N^2)
冒泡排序
void BubbleSort1 ( int array[ ] , int n)
{
for ( int i = 0 ; i < n- 1 ; i++ )
{
for ( int j = i + 1 ; j < n- 1 ; j++ )
{
if ( array[ i] > array[ j] )
{
int t= array[ i] ;
array[ i] = array[ j] ;
array[ j] = t;
}
}
}
}
插入排序
void Insertsort ( int A[ ] , int N)
{
int t;
for ( int i= 0 ; i< N; i++ )
{
int j;
t= A[ i] ;
for ( j= i; j> 0 && A[ j- 1 ] > t; j-- )
{
A[ j] = A[ j- 1 ] ;
}
A[ j] = t;
}
}
O(NlogN)
希尔排序
void Shellsort ( int A[ ] , int N)
{
int i, j, Increment;
int tmp;
for ( Increment= N/ 2 ; Increment> 0 ; Increment/= 2 )
{
for ( i= Increment; i< N; i++ )
{
tmp= A[ i] ;
for ( j= i; j>= Increment; j-= Increment)
{
if ( tmp< A[ j- Increment] )
{
A[ j] = A[ j- Increment] ;
}
else break ;
}
A[ j] = tmp;
}
}
}
基数排序
# include <string.h>
# include <stdlib.h>
# include <stdio.h>
# define N 10
# define D 10
int GetDigit ( int M, int i)
{
while ( i > 1 )
{
M /= 10 ;
i-- ;
}
return M % 10 ;
}
void RadixSort ( int num[ ] , int len)
{
int i, j, k, l, digit;
int allot[ 10 ] [ N] ;
memset ( allot, 0 , sizeof ( allot) ) ;
for ( i = 1 ; i <= D; i++ )
{
int flag = 0 ;
for ( j = 0 ; j < len; j++ )
{
digit = GetDigit ( num[ j] , i) ;
k = 0 ;
while ( allot[ digit] [ k] )
k++ ;
allot[ digit] [ k] = num[ j] ;
if ( digit)
flag = 1 ;
}
if ( ! flag)
break ;
l = 0 ;
for ( j = 0 ; j < 10 ; j++ )
{
k = 0 ;
while ( allot[ j] [ k] > 0 )
{
num[ l++ ] = allot[ j] [ k] ;
k++ ;
}
}
memset ( allot, 0 , sizeof ( allot) ) ;
}
}
int main ( )
{
int num[ N] = { 52 , 20 , 4 , 10 , 17 , 39 , 8 , 300 , 60 , 81 } ;
RadixSort ( num, N) ;
for ( int i = 0 ; i < N; i++ )
printf ( "%d " , num[ i] ) ;
printf ( "\n" ) ;
system ( "pause" ) ;
return 0 ;
}
堆排序
# define LeftChild ( i) ( ( 2 * i) + 1 )
void Perdown ( int A[ ] , int i, int N)
{
int child;
int temp;
for ( temp= A[ i] ; LeftChild ( i) < N; i= child)
{
child= LeftChild ( i) ;
if ( child!= N- 1 && A[ child+ 1 ] > A[ child] )
child++ ;
if ( temp< A[ child] )
A[ i] = A[ child] ;
else break ;
}
A[ i] = temp;
}
void Heapsort ( int A[ ] , int N)
{
int i;
for ( int i= N/ 2 ; i>= 0 ; i-- )
{
Perdown ( A, i, N) ;
}
for ( int i= N- 1 ; i> 0 ; i-- )
{
Swap ( & A[ 0 ] , & A[ i] ) ;
Perdown ( A, 0 , i) ;
}
}
归并排序
int a[ 100 ] ;
int b[ 100 ] ;
void msort ( int l, int r)
{
if ( l == r) return ;
int mid = ( l + r) >> 1 ;
msort ( l, mid) ;
msort ( mid, r) ;
int pos = l;
int lpos = l;
int rpos = mid + 1 ;
while ( lpos <= mid && rpos <= r)
{
if ( a[ lpos] <= a[ rpos] ) b[ pos++ ] = a[ lpos++ ] ;
else b[ pos++ ] = a[ rpos++ ] ;
}
while ( lpos <= mid) b[ pos++ ] = a[ lpos++ ] ;
while ( rpos <= r) b[ pos++ ] = a[ rpos++ ] ;
for ( int t = l; t <= r; t++ )
{
a[ t] = b[ t] ;
}
}
快速排序
void QuickSort ( int A[ ] , int N)
{
Qsort ( A, 0 , N- 1 ) ;
}
int Median3 ( int A[ ] , int Left, int Right)
{
int center= ( Left+ Right) / 2 ;
if ( A[ Left] > A[ center] ) swap ( & A[ Left] , & A[ center] ) ;
if ( A[ Left] > A[ Right] ) swap ( & A[ Left] , & A[ Right] ) ;
if ( A[ center] > A[ Right] ) swap ( & A[ center] , & A[ Right] ) ;
swap ( & A[ center] , & A[ Right- 1 ] ) ;
return A[ Right- 1 ] ;
}
void Qsort ( int A[ ] , int Left, int Right)
{
int i, j, prvot;
if ( Left+ 3 <= Right)
{
prvot= Median3 ( A, Left, Right) ;
i= Left;
j= Right- 1 ;
for ( ; ; )
{
while ( A[ ++ i] < prvot) { } ;
while ( A[ -- j] > prvot) { } ;
if ( i< j)
{
swap ( & A[ i] , & A[ j] ) ;
}
else break ;
}
swap ( & A[ i] , & A[ Right- 1 ] ) ;
Qsort ( A, Left, i- 1 ) ;
Qsort ( A, i+ 1 , Right) ;
}
else
{
Insertsort ( A+ Left, Left+ Right- 1 ) ;
}
}
void Insertsort ( int A[ ] , int N)
{
int t;
for ( int i= 0 ; i< N; i++ )
{
int j;
t= A[ i] ;
for ( j= i; j> 0 && A[ j- 1 ] > t; j-- )
{
A[ j] = A[ j- 1 ] ;
}
A[ j] = t;
}
}