基本原理如上图,其中图C中的temp指向一个长度和红色竖线左边数组长度相等的辅助数组作为合并操作的辅助buffer,
#include <iostream>
#include <cstdio>
#include <cmath>
#include <ctime>
using namespace std ;
int* array = NULL ;
void get_rand_num(int ** parray , int len) //生成一个随机数组
{
srand((unsigned int )time(NULL)) ; //下种子
*parray = new int[len] ;
for(int i = 0 ; i < len ; i++)
{
(*parray)[i] = rand() % len ;
}
}
void merge_sort(int * _array , int len )
{
if(len <= 1) return; //递归基
int *pleft = _array;
int *pright = _array + len / 2 ;
merge_sort(_array , len / 2 ); //递归排序前半部分数组
merge_sort(_array + len / 2 , len - len / 2 ) ; //递归排序后半部分数组
//合并
int *temp = new int[ len / 2] ;
for(int i = 0 ; i < len / 2 ; i++ )
{
temp[ i ] = pleft[ i ] ;
}
int left = 0 , right = 0 , i = 0 ;
while(left < len /2 && right < len - len / 2)
{
if(temp[ left] < pright[ right ] )
{ pleft[ i ]= temp[ left ] ; left++ ; }
else
{pleft[ i ]= pright[ right ] ; right++ ; }
i++ ;
}
if(left <len / 2 )
for(int j = left ; j < len / 2 ; j++)
{ pleft[ i ] = temp[left] ; i++ ; }
if(right < len - len / 2)
for(int j = right ; j < len - len / 2 ; j++)
{ pleft[ i ] = pright[ j ] ; i++ ; }
delete[ ]temp ;
return ;
}
int main(int argc , char** argv)
{
int len = 50 ;
get_rand_num(&array , len) ;
cout<<"before sort"<<endl ;
for(int i = 0 ; i < 50 ; i++)
{
cout<<"array["<<i<<"]="<<array[i]<<endl ;
}
merge_sort(array , len) ;
cout<<"after sorting"<<endl;
for(int i = 0 ; i < 50 ; i++)
{
cout<<"array["<<i<<"]="<<array[i]<<endl ;
}
system("pause") ;
delete[ ]array ;
array = NULL ;
return 0 ;
}