插入类排序
直接插入排序
void insert_sort ( int arr[ ] , int len) {
int record, j;
for ( int i = 1 ; i < len; i++ ) {
record = arr[ i] ;
for ( j = i - 1 ; j >= 0 && arr[ j] > record; j-- )
arr[ j + 1 ] = arr[ j] ;
arr[ j + 1 ] = record;
}
}
折半(二分)插入排序
void binary_insert_sort ( int arr[ ] , int len) {
int record;
for ( int i = 1 ; i < len; i++ ) {
record = arr[ i] ;
int low = 0 , high = i - 1 , mid;
while ( low <= high) {
mid = ( low + high) / 2 ;
if ( record < arr[ mid] )
high = mid - 1 ;
else
low = mid + 1 ;
}
for ( int j = i - 1 ; j >= low; j-- )
arr[ j + 1 ] = arr[ j] ;
arr[ low] = record;
}
}
希尔排序
void shell_sort ( int arr[ ] , int len) {
for ( int delta = len / 2 ; delta > 0 ; delta / = 2 )
for ( int i = delta; i < len; i++ ) {
int record = arr[ i] , j;
for ( j = i - delta; j >= 0 && arr[ j] > record; j - = delta)
arr[ j + delta] = arr[ j] ;
arr[ j + delta] = record;
}
}
交换类排序
冒泡排序
void bubble_sort ( int arr[ ] , int len) {
int i, j, t;
for ( i = 0 ; i < len - 1 ; i++ )
for ( j = i + 1 ; j < len; j++ )
if ( arr[ i] > arr[ j] ) {
t = arr[ i] ;
arr[ i] = arr[ j] ;
arr[ j] = t;
}
}
快速排序
void quick_sort ( int arr[ ] , int begin, int end) {
if ( begin == end)
return ;
int key = arr[ begin] , i = begin, j = end;
while ( i < j) {
while ( i < j && arr[ i] <= key)
i++ ;
while ( i < j && arr[ j] >= key)
j-- ;
if ( i != j) {
int temp = arr[ i] ;
arr[ i] = arr[ j] ;
arr[ j] = temp;
}
}
i = ( i == j) ? ( i - 1 ) : i;
int temp = arr[ begin] ;
arr[ begin] = arr[ i] ;
arr[ i] = temp;
quick_sort ( arr, begin, i) ;
quick_sort ( arr, i + 1 , end) ;
}
选择类排序
选择排序
void selection_sort ( int arr[ ] , int len) {
int i, j, t;
for ( i = 0 ; i < len - 1 ; i++ ) {
int k = i;
for ( j = i + 1 ; j < len; j++ )
if ( arr[ k] > arr[ j] )
k = j;
if ( k != i) {
t = arr[ i] ;
arr[ i] = arr[ k] ;
arr[ k] = t;
}
}
}
树形选择排序
void tree_selection_sort ( int arr[ ] , int len) {
int treeLen = len * 2 - 1 , difference = treeLen - len;
int tree[ treeLen] , key[ treeLen] ;
for ( int i = 0 ; i < len; i++ ) {
tree[ i + difference] = arr[ i] ;
key[ i + difference] = i;
}
for ( int i = 0 ; i < len; i++ ) {
for ( int j = difference - 1 ; j >= 0 ; j-- ) {
tree[ j] = ( tree[ j * 2 + 1 ] < tree[ j * 2 + 2 ] ) ? tree[ j * 2 + 1 ] : tree[ j * 2 + 2 ] ;
key[ j] = ( tree[ j * 2 + 1 ] < tree[ j * 2 + 2 ] ) ? key[ j * 2 + 1 ] : key[ j * 2 + 2 ] ;
}
tree[ key[ 0 ] + difference] = INT_MAX;
if ( key[ 0 ] != i) {
int temp = arr[ i] ;
arr[ i] = arr[ key[ 0 ] ] ;
arr[ key[ 0 ] ] = temp;
temp = tree[ key[ 0 ] + difference] ;
tree[ key[ 0 ] + difference] = tree[ i + difference] ;
tree[ i + difference] = temp;
}
}
}
堆排序
void heap_sort ( int arr[ ] , int len) {
for ( int remain = len - 1 ; remain > 0 ; remain-- ) {
for ( int i = ( remain - 1 ) / 2 ; i >= 0 ; i-- ) {
int maxKey;
if ( i * 2 + 2 >= len)
maxKey = i * 2 + 1 ;
else
maxKey = ( arr[ i * 2 + 1 ] > arr[ i * 2 + 2 ] ) ? ( i * 2 + 1 ) : ( i * 2 + 2 ) ;
if ( arr[ i] < arr[ maxKey] ) {
int temp = arr[ i] ;
arr[ i] = arr[ maxKey] ;
arr[ maxKey] = temp;
}
}
int temp = arr[ 0 ] ;
arr[ 0 ] = arr[ remain] ;
arr[ remain] = temp;
}
}
归并排序
void merge_sort ( int arr[ ] , int low, int high) {
if ( low < high) {
int mid = ( low + high) / 2 ;
merge_sort ( arr, low, mid) ;
merge_sort ( arr, mid + 1 , high) ;
merge ( arr, low, high, mid) ;
}
}
void merge ( int arr[ ] , int low, int high, int mid) {
int p = low, q = mid + 1 ;
int t[ high - low + 1 ] ;
int i;
for ( i = 0 ; i < high - low + 1 && p <= mid && q <= high; i++ )
if ( arr[ p] < arr[ q] )
t[ i] = arr[ p++ ] ;
else
t[ i] = arr[ q++ ] ;
if ( p > mid)
while ( q <= high) t[ i++ ] = arr[ q++ ] ;
if ( q > high)
while ( p <= mid) t[ i++ ] = arr[ p++ ] ;
for ( i = low; i <= high; i++ )
arr[ i] = t[ i - low] ;
}
计数排序
分配类排序
捅排序
基数排序