C语言实现九种排序
头文件
#ifndef _MYSORT_H_
#define _MYSORT_H_
typedef enum { UP, DOWN} SORTWAY;
void myswap ( int * a, int * b) ;
void arrayswap ( int a[ ] , int i, int j) ;
void myprint ( int a[ ] , int len) ;
void bubble_sort ( int array[ ] , int len_array, SORTWAY way) ;
void r_bubble_sort ( int array[ ] , int len_array, SORTWAY way) ;
void cocktail_sort ( int array[ ] , int len_array, SORTWAY way) ;
void r_cocktail_sort ( int array[ ] , int left, int right, SORTWAY way) ;
void selection_sort ( int array[ ] , int len_array, SORTWAY way) ;
void r_selection_sort ( int array[ ] , int len_array, int limit_index, SORTWAY way) ;
void Insertion_sort ( int array[ ] , int len_array, SORTWAY way) ;
void Insertion_DIV_sort ( int array[ ] , int len_array, SORTWAY way) ;
void Shell_sort ( int array[ ] , int len_array, SORTWAY way) ;
void Heap_sort ( int array[ ] , int len_array, SORTWAY way) ;
void merge ( int array[ ] , int left, int mid, int right, int * tmp, SORTWAY way) ;
void r_merge_sort ( int array[ ] , int left, int right, int tmp[ ] , SORTWAY way) ;
int partition ( int array[ ] , int left, int right, SORTWAY way) ;
void r_quick_sort ( int array[ ] , int left, int right, SORTWAY way) ;
#endif
C文件
#include <stdio.h>
#include <stdlib.h>
#include "mysort.h"
void myswap ( int * a, int * b)
{
int tmp = * a;
* a = * b;
* b = tmp ;
}
void arrayswap ( int a[ ] , int i, int j)
{
int tmp = a[ i] ;
a[ i] = a[ j] ;
a[ j] = tmp;
}
void myprint ( int a[ ] , int len)
{
int i;
for ( i= 0 ; i< len; i++ )
printf ( "%4d" , a[ i] ) ;
printf ( "\n" ) ;
}
void bubble_sort ( int array[ ] , int len_array, SORTWAY way)
{
int i, j;
for ( i= 0 ; i< len_array- 1 ; i++ )
{
for ( j= 0 ; j< len_array- 1 - i; j++ )
{
if ( UP == way)
{
if ( array[ j] < array[ j+ 1 ] )
{
int tmp = array[ j] ;
array[ j] = array[ j+ 1 ] ;
array[ j+ 1 ] = tmp;
}
}
else
{
if ( array[ j] > array[ j+ 1 ] )
{
int tmp = array[ j] ;
array[ j] = array[ j+ 1 ] ;
array[ j+ 1 ] = tmp;
}
}
}
}
}
void r_bubble_sort ( int array[ ] , int len_array, SORTWAY way)
{
int i;
for ( i= 0 ; i< len_array- 1 - i; i++ )
{
if ( UP == way)
{
if ( array[ i] < array[ i+ 1 ] )
{
int tmp = array[ i] ;
array[ i] = array[ i+ 1 ] ;
array[ i+ 1 ] = tmp;
}
}
else
{
if ( array[ i] > array[ i+ 1 ] )
{
int tmp = array[ i] ;
array[ i] = array[ i+ 1 ] ;
array[ i+ 1 ] = tmp;
}
}
}
r_bubble_sort ( array, len_array- 1 , way) ;
}
void cocktail_sort ( int array[ ] , int len_array, SORTWAY way)
{
int left = 0 ;
int right = len_array- 1 ;
while ( left < right)
{
if ( UP == way)
{
int i;
for ( i = left ; i< right; i++ )
{
if ( array[ i] > array[ i+ 1 ] )
{
myswap ( & array[ i] , & array[ i+ 1 ] ) ;
}
}
right-- ;
for ( i = right ; i> left; i-- )
{
if ( array[ i] < array[ i- 1 ] )
{
myswap ( & array[ i] , & array[ i- 1 ] ) ;
}
}
left++ ;
}
else
{
int i;
for ( i = left ; i< right; i++ )
{
if ( array[ i] < array[ i+ 1 ] )
{
myswap ( & array[ i] , & array[ i+ 1 ] ) ;
}
}
right-- ;
for ( i = right ; i> left; i-- )
{
if ( array[ i] > array[ i- 1 ] )
{
myswap ( & array[ i] , & array[ i- 1 ] ) ;
}
}
left++ ;
}
}
}
void r_cocktail_sort ( int array[ ] , int left, int right, SORTWAY way)
{
if ( left >= right)
return ;
if ( UP == way)
{
int i;
for ( i = left ; i< right; i++ )
{
if ( array[ i] > array[ i+ 1 ] )
{
myswap ( & array[ i] , & array[ i+ 1 ] ) ;
}
}
right-- ;
for ( i = right ; i> left; i-- )
{
if ( array[ i] < array[ i- 1 ] )
{
myswap ( & array[ i] , & array[ i- 1 ] ) ;
}
}
left++ ;
}
else
{
int i;
for ( i = left ; i< right; i++ )
{
if ( array[ i] < array[ i+ 1 ] )
{
myswap ( & array[ i] , & array[ i+ 1 ] ) ;
}
}
right-- ;
for ( i = right ; i> left; i-- )
{
if ( array[ i] > array[ i- 1 ] )
{
myswap ( & array[ i] , & array[ i- 1 ] ) ;
}
}
left++ ;
}
r_cocktail_sort ( array, left, right, way) ;
}
void selection_sort ( int array[ ] , int len_array, SORTWAY way)
{
int i, j ;
for ( i= 0 ; i< len_array- 1 ; i++ )
{
if ( UP == way)
{
int min = i;
for ( j = i+ 1 ; j< len_array; j++ )
{
if ( array[ min] > array[ j] )
min = j;
}
if ( min != i)
arrayswap ( array, min, i) ;
}
else
{
int max = i;
for ( j = i+ 1 ; j< len_array; j++ )
{
if ( array[ max] < array[ j] )
max = j;
}
if ( max != i)
arrayswap ( array, max, i) ;
}
}
}
void r_selection_sort ( int array[ ] , int len_array, int limit_index, SORTWAY way)
{
if ( limit_index == len_array- 1 )
return ;
int i;
if ( UP == way)
{
int min = limit_index ;
for ( i = min+ 1 ; i< len_array; i++ )
{
if ( array[ min] > array[ i] )
min = i;
}
if ( min != limit_index)
arrayswap ( array, min, limit_index) ;
}
else
{
int max = limit_index;
for ( i = max+ 1 ; i< len_array; i++ )
{
if ( array[ max] < array[ i] )
max = i;
}
if ( max != limit_index)
arrayswap ( array, max, limit_index) ;
}
limit_index++ ;
r_selection_sort ( array, len_array, limit_index, way) ;
}
void Insertion_sort ( int array[ ] , int len_array, SORTWAY way)
{
int i, j;
for ( i= 1 ; i< len_array; i++ )
{
j = i- 1 ;
int tmp = array[ j+ 1 ] ;
while ( j>= 0 )
{
if ( UP == way)
{
if ( tmp >= array[ j] )
{
break ;
}
else
{
array[ j+ 1 ] = array[ j] ;
j-- ;
}
}
else
{
if ( tmp <= array[ j] )
{
break ;
}
else
{
array[ j+ 1 ] = array[ j] ;
j-- ;
}
}
}
array[ j+ 1 ] = tmp;
}
}
void Insertion_DIV_sort ( int array[ ] , int len_array, SORTWAY way)
{
int i;
for ( i= 1 ; i< len_array; i++ )
{
int left = 0 ;
int right = i- 1 ;
int tmp = array[ i] ;
while ( left <= right )
{
int mid = ( left+ right) / 2 ;
if ( UP == way)
{
if ( tmp < array[ mid] )
right = mid- 1 ;
else
left = mid+ 1 ;
}
else
{
if ( tmp > array[ mid] )
right = mid- 1 ;
else
left = mid+ 1 ;
}
}
int j;
for ( j= i- 1 ; j>= left; j-- )
array[ j+ 1 ] = array[ j] ;
array[ left] = tmp;
}
}
void Shell_sort ( int array[ ] , int len_array, SORTWAY way)
{
int gap = 0 ;
while ( gap < len_array)
{
gap = gap* 3 + 1 ;
}
while ( gap> 0 )
{
int i;
for ( i = gap; i< len_array; i++ )
{
int j = i- gap;
int tmp = array[ i] ;
while ( j>= 0 )
{
if ( UP == way)
{
if ( tmp < array[ j] )
{
array[ j+ gap] = array[ j] ;
j- = gap;
}
else
{
break ;
}
}
else
{
if ( tmp > array[ j] )
{
array[ j+ gap] = array[ j] ;
j- = gap;
}
else
{
break ;
}
}
}
array[ j+ gap] = tmp;
}
gap / = 3 ;
}
}
void r_herify ( int array[ ] , int index, int len_array, SORTWAY way)
{
int lchild_index = 2 * index+ 1 ;
int rchild_index = 2 * index+ 2 ;
if ( UP == way)
{
int max = index;
if ( lchild_index< len_array && array[ max] < array[ lchild_index] )
max = lchild_index;
if ( rchild_index< len_array && array[ max] < array[ rchild_index] )
max = rchild_index;
if ( max != index)
{
arrayswap ( array, max, index) ;
r_herify ( array, max, len_array, way) ;
}
}
else
{
int min = index;
if ( lchild_index< len_array && array[ min] > array[ lchild_index] )
min = lchild_index;
if ( rchild_index< len_array && array[ min] > array[ rchild_index] )
min = rchild_index;
if ( min != index)
{
arrayswap ( array, min, index) ;
r_herify ( array, min, len_array, way) ;
}
}
}
void Heap_sort ( int array[ ] , int len_array, SORTWAY way)
{
int i;
for ( i= len_array/ 2 - 1 ; i>= 0 ; i-- )
{
r_herify ( array, i, len_array, way) ;
}
int last = len_array;
for ( i = len_array- 1 ; i > 0 ; i-- )
{
arrayswap ( array, 0 , i) ;
last-- ;
r_herify ( array, 0 , last, way) ;
}
}
void merge ( int array[ ] , int left, int mid, int right, int * tmp, SORTWAY way)
{
int i = left;
int j = mid+ 1 ;
int k = 0 ;
if ( UP == way)
{
while ( i<= mid && j<= right)
{
if ( array[ i] < array[ j] )
tmp[ k++ ] = array[ i++ ] ;
else
tmp[ k++ ] = array[ j++ ] ;
}
while ( i<= mid)
tmp[ k++ ] = array[ i++ ] ;
while ( j<= right)
tmp[ k++ ] = array[ j++ ] ;
}
else
{
while ( i<= mid && j<= right)
{
if ( array[ i] > array[ j] )
tmp[ k++ ] = array[ i++ ] ;
else
tmp[ k++ ] = array[ j++ ] ;
}
while ( i<= mid)
tmp[ k++ ] = array[ i++ ] ;
while ( j<= right)
tmp[ k++ ] = array[ j++ ] ;
}
for ( i= 0 ; i< k; i++ )
{
array[ left+ i] = tmp[ i] ;
}
}
void r_merge_sort ( int array[ ] , int left, int right, int tmp[ ] , SORTWAY way)
{
if ( left>= right)
return ;
int mid = ( left+ right) / 2 ;
r_merge_sort ( array, left, mid, tmp, way) ;
r_merge_sort ( array, mid+ 1 , right, tmp, way) ;
merge ( array, left, mid, right, tmp, way) ;
}
int partition ( int array[ ] , int left, int right, SORTWAY way)
{
int pivot = array[ right] ;
while ( left< right)
{
if ( UP == way)
{
while ( array[ left] <= pivot && left< right)
{
left++ ;
}
if ( left< right)
{
array[ right] = array[ left] ;
right-- ;
}
while ( array[ right] >= pivot && left< right)
{
right-- ;
}
if ( left< right)
{
array[ left] = array[ right] ;
left++ ;
}
}
else
{
while ( array[ left] >= pivot && left< right)
{
left++ ;
}
if ( left< right)
{
array[ right] = array[ left] ;
right-- ;
}
while ( array[ right] <= pivot && left< right)
{
right-- ;
}
if ( left< right)
{
array[ left] = array[ right] ;
left++ ;
}
}
}
array[ left] = pivot;
return left;
}
void r_quick_sort ( int array[ ] , int left, int right, SORTWAY way)
{
if ( left< right)
{
int pivotIndex = partition ( array, left, right, way) ;
r_quick_sort ( array, left, pivotIndex- 1 , way) ;
r_quick_sort ( array, pivotIndex+ 1 , right, way) ;
}
}
测试主函数
#include <stdio.h>
#include "mysort.h"
int main ( )
{
int a[ ] = { 1 , 5 , 3 , 6 , 8 , 4 , 6 , 5 , 4 } ;
int len = sizeof ( a) / sizeof ( a[ 0 ] ) ;
myprint ( a, len) ;
printf ( "冒泡排序**********************\n" ) ;
bubble_sort ( a, len, UP) ;
myprint ( a, len) ;
bubble_sort ( a, len, DOWN) ;
myprint ( a, len) ;
printf ( "鸡尾酒排序**********************\n" ) ;
cocktail_sort ( a, len, UP) ;
myprint ( a, len) ;
cocktail_sort ( a, len, DOWN) ;
myprint ( a, len) ;
r_cocktail_sort ( a, 0 , len- 1 , UP) ;
myprint ( a, len) ;
r_cocktail_sort ( a, 0 , len- 1 , DOWN) ;
myprint ( a, len) ;
printf ( "选择排序**********************\n" ) ;
selection_sort ( a, len, UP) ;
myprint ( a, len) ;
r_selection_sort ( a, len, 0 , DOWN) ;
myprint ( a, len) ;
printf ( "插入排序**********************\n" ) ;
Insertion_sort ( a, len, UP) ;
myprint ( a, len) ;
Insertion_sort ( a, len, DOWN) ;
myprint ( a, len) ;
printf ( "二分法插入排序**********************\n" ) ;
Insertion_DIV_sort ( a, len, UP) ;
myprint ( a, len) ;
Insertion_DIV_sort ( a, len, DOWN) ;
myprint ( a, len) ;
printf ( "希尔分组插入排序**********************\n" ) ;
Shell_sort ( a, len, UP) ;
myprint ( a, len) ;
Shell_sort ( a, len, DOWN) ;
myprint ( a, len) ;
printf ( "堆排序****************************\n" ) ;
Heap_sort ( a, len, UP) ;
myprint ( a, len) ;
Heap_sort ( a, len, DOWN) ;
myprint ( a, len) ;
printf ( "归并排序****************************\n" ) ;
int tmp[ 10 ] = { 0 } ;
r_merge_sort ( a, 0 , len- 1 , tmp, UP) ;
myprint ( a, len) ;
r_merge_sort ( a, 0 , len- 1 , tmp, DOWN) ;
myprint ( a, len) ;
printf ( "快速排序****************************\n" ) ;
r_quick_sort ( a, 0 , len- 1 , UP) ;
myprint ( a, len) ;
r_quick_sort ( a, 0 , len- 1 , DOWN) ;
myprint ( a, len) ;
return 0 ;
}