#include<stdio.h>
void sort(int a[],int start,int end); //声明
void marge(int a[],int temp[],int start,int middle,int end);
int main()
{
int a[1000],temp[1000],i,n;
printf("请输入数组个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入第%d个数:",i+1);
scanf("%d",&a[i]);
}
printf("排序前的数组为:");
for(i=0;i<n;i++)
printf("a[%d] = %d\t",i,a[i]);
printf("\n");
sort(a, temp, 0, n-1); //函数调用
printf("排序后的数组为:");
for(i=0;i<n;i++)
printf("a[%d] = %d\t",i,a[i]);
printf("\n");
return 0;
}
void sort(int a[],int temp[],int start,int end)
{
int middle;
if(start < end)
{
middle = (start + end)/2;
sort(a,temp,start,middle); //递归思想***
sort(a,temp,middle+1,end);
marge(a,temp,start,middle,end);
}
return;
}
void marge(int a[],int temp[],int start,int middle,int end)
{
int i = start,j = middle + 1,k = start;
while(i != middle + 1 && j != end + 1)
{
if(a[i] < a[j]) //从小到大排序
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while(i != middle+1) //等价于 j == end+1 即右半边没有元素
temp[k++] = a[i++];
while(j != end + 1) //等价于i == middle+1 即左半边没有元素
temp[k++] = a[j++];
for(i=start;i <= end;i++) //把临时数组放到原数组中
a[i] = temp[i];
}