#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void merge(int result[],int data[],int left,int mid,int right)
{
int i = left;
int j = mid;
int cnt = left;
for(; i<mid&&j<=right;)
{
if(data[i] < data[j])
result[cnt++] = data[i++];
else
result[cnt++] = data[j++];
}
for(; i<mid; i++)
result[cnt++] = data[i];
for(; j<=right; j++)
result[cnt++] = data[j];
for(i=left; i<=right; i++)
data[i] = result[i];
}
void merge_sort(int result[],int data[],int left,int right)
{
//if(left == right)
if(left < right)
{
int mid = (right + left) / 2;
// printf("%d %d\n",left,right);
merge_sort(result,data,left,mid);
merge_sort(result,data,mid+1,right);
merge(result,data,left,mid+1,right);
}
}
void display(int data[],int size)
{
for(int i=0; i<size; i++)
printf("%d ",data[i]);
printf("\n");
}
int main()
{
int data[] = {2,32,23,2,22,45,34,234,24324};
int size = sizeof(data)/sizeof(int);
int workspace[size] ;
memset(workspace,-1,size*sizeof(int));
display(data,size);
merge_sort(workspace,data,0,size-1);
display(data,size);
return 0;
}
在归并的时候,记得把辅助空间的数据复制回待排序空间数组。
同时注意下标!如我在编写的时候搞错了下标的开始 cnt = 0;应为cnt = left.
而且归并的时候 i++,j++;不是同时进行的,这都搞错~.~||||