#include<stdio.h>
#include<malloc.h>
void copyArray(int source[], int dest[],int len,int first);
void merge(int a[],int left,int right);
void show_array( int a[], int n )
{
int i;
for( i = 0; i < n; i++ )
printf( "%d ", a[i] );
printf("\n");
}
void mergeSort(int a[],int left,int right)
{
int i;
// 保证至少有两个元素
if(left < right)
{
i = (left+right)/2;
mergeSort(a,left,i);
mergeSort(a,i+1,right);
merge(a,left,right);
}
}
void merge(int a[],int left,int right)
{
int begin1 = left;
int mid = (left+right)/2 ;
int begin2 = mid+1;
int k=0;
int newArrayLen = right-left+1;
int *b = (int*)malloc(newArrayLen*sizeof(int));
while(begin1<=mid && begin2<=right)
{
if(a[begin1]<=a[begin2])
b[k++] = a[begin1++];
else
b[k++] = a[begin2++];
}
while(begin1<=mid)
b[k++] = a[begin1++];
while(begin2<=right)
b[k++] = a[begin2++];
copyArray(b,a,newArrayLen,left);
free(b);
}
/**
* 复制数组
* source:源数组
* dest:目标数组
* len:源数组长度
* first:目标数组起始位置
*
*/
void copyArray(int source[], int dest[],int len,int first)
{
int i;
int j=first;
for(i=0;i<len;i++)
{
dest[j] = source[i];
j++;
}
}
int main()
{
int a[] = {2,1,3,6,4,5,7,10,8,9,2,5};
int len = sizeof(a)/sizeof(int);
show_array(a,len);
mergeSort(a,0,len-1);
show_array(a,len);
return 0;
}