二路归并排序
7.1 二路归并排序的思想
一次排序过程,将已经各自有序的两个段的数据合并一个段,并且合并后依旧有序。 第一次我们认为单个数据是有序的,一个数据就是一个段,一次排序后,两个数据就是一个有序数据段,这样下一次每个有序数据段就是两个数据。最后将其合并成一个完成有序段,则整个数据就已经排序好了。
7.1二路归并排序的实现
void Meger ( int * arr, int len, int width, int * brr)
{
int low1 = 0 ;
int high1 = low1 + width - 1 ;
int low2 = high1 + 1 ;
int high2 = low2 + width > len ? len - 1 : low2 + width - 1 ;
int index = 0 ;
while ( low2 < len)
{
while ( low1 <= high1 && low2 <= high2)
{
if ( arr[ low1] < arr[ low2] ) brr[ index++ ] = arr[ low1++ ] ;
else brr[ index++ ] = arr[ low2++ ] ;
}
while ( low1 <= high1) brr[ index++ ] = arr[ low1++ ] ;
while ( low2 <= high2) brr[ index++ ] = arr[ low2++ ] ;
low1 = high2 + 1 ;
high1 = low1 + width - 1 ;
low2 = high1 + 1 ;
high2 = low2 + width > len ? len - 1 : low2 + width - 1 ;
}
while ( low1 < len) brr[ index++ ] = arr[ low1++ ] ;
for ( int i = 0 ; i < len; ++ i) arr[ i] = brr[ i] ;
}
void MegerSort ( int * arr, int len)
{
int * brr = ( int * ) malloc ( sizeof ( int ) * len) ;
assert ( brr != NULL ) ;
for ( int i = 1 ; i < len; i * = 2 )
{
Meger ( arr, len, i, brr) ;
}
free ( brr) ;
}