/*=============================================================================
#
# 分治为子序列
# 归并排序
#
#
=============================================================================*/
#include <stdio.h>
#include <time.h>
#include <malloc.h>
int arr[]={6, 3, 5, 7, 2, 4, 1, 8, 10, 9};
//把数组合并
void merg_array(int *a1,int len1,int *a2,int len2)
{
int i=0,j=0,k=0;
int *arr_temp=(int *)malloc(sizeof(int)*(len1+len2));
while(i<len1&&j<len2)
arr_temp[k++]=a1[i]<a2[j]? a1[i++]:a2[j++];
//a2已经为空,把a1中剩余的数搬到arr_temp中去就可以了
while(i<len1)
arr_temp[k++]=a1[i++];
while(j<len2)
arr_temp[k++]=a2[j++];
for(i=0,k=0;i<len1+len2;++i,++k)
a1[i]=arr_temp[k];
free(arr_temp);
}
//
void merg_sort(int *a,int len)
{
//结束条件
if(len<=1)
return;
int *a1,*a2,len1,len2;
len1=len/2; len2=len-len1; a1=a; a2=a+len1;
//分治调用
merg_sort(a1,len1);
merg_sort(a2,len2);
//分治结束,合并两个子数组
merg_array(a1,len1,a2,len2);
}
int main()
{
int len=sizeof(arr)/sizeof(arr[0]);
merg_sort(arr,len);
for(int i=0;i<len;++i)
printf("%d ",arr[i]);
return 0;
}