归并排序
gerge()是采用递归的方法,将data分成两份,直到每份只剩下一个元素 【因为蓝色框与绿色框是相同的结构,所以用递归法实现】 递归后,sort()是将两个分组进行排序,该排序算法是将两个有序序列合并成一个有序序列 【在紫色框中,将两个相同色块的序列合并成一个】
sort()的合并算法: 对比 i 和 j,将值小的放到 temp 序列里面,再将比较小的那个值的下标+1(即向后移),最后在将 temp(棕色部分拷贝到原序列 data 中)
#include <stdio.h>
#include <stdlib.h>
void sort ( int * data, int * temp, int start, int middle, int end)
{
int i, j, k;
if ( end <= start) return ;
i = start;
j = middle + 1 ;
k = start;
while ( i <= middle && j <= end)
{
if ( data[ i] >= data[ j] )
{
temp[ k++ ] = data[ j++ ] ;
}
if ( data[ i] <= data[ j] )
{
temp[ k++ ] = data[ i++ ] ;
}
}
while ( i <= middle)
{
temp[ k++ ] = data[ i++ ] ;
}
while ( j <= end)
{
temp[ k++ ] = data[ j++ ] ;
}
for ( i = start; i <= end; i++ )
{
data[ i] = temp[ i] ;
}
}
void merge ( int * data, int * temp, int start, int end)
{
int middle;
if ( start < end)
{
middle = start + ( end - start) / 2 ;
merge ( data, temp, start, middle) ;
merge ( data, temp, middle + 1 , end) ;
sort ( data, temp, start, middle, end) ;
}
}
void merge_sort ( int * data, int length)
{
int * temp = NULL ;
temp = ( int * ) calloc ( length, sizeof ( int ) ) ;
if ( temp == NULL )
{
return ;
}
merge ( data, temp, 0 , length - 1 ) ;
if ( temp != NULL )
{
free ( temp) ;
temp = NULL ;
}
}
int main ( void )
{
int data[ ] = { 56 , 34 , 54 , 50 , 81 , 70 , 7 , 74 , 26 , 65 , 71 , 4 , 37 , 76 , 91 , 36 } ;
int length = sizeof ( data) / sizeof ( data[ 0 ] ) ;
int i;
merge_sort ( data, length) ;
for ( i = 0 ; i < length; i++ )
{
printf ( "%4d" , data[ i] ) ;
}
printf ( "\n" ) ;
return 0 ;
}