应该说早就知道了,但是一直没有实现,一般用快排的,但是今天实现时,问题还不少啊,主要是等号问题的
#include <stdio.h>
#include <stdlib.h>
void combine(int low,int high,int arr[]) //将两列有顺序的合并起来
{
int i,j,m,n;
int brr[30]={0};
for(i=low;i<=high;i++) //将arr的值赋给brr
{
brr[i]=arr[i];
}
j=(low+high)/2; //其中一个数组的上限
n=j+1; //另一数组的下限
m=low;
while(n<=high||low<=j) //n和low分别表示两个数组的变化指针
{
while((brr[low]>=brr[n]||low>j)&&n<=high) //当前一个数组已经完了或都第一个当前
{ //小于第二个的当前取第一个的,注意等号。
arr[m]=brr[n];
n++;
m++;
}
while((brr[low]<=brr[n]||high<n)&&low<=j)
{
arr[m]=brr[low];
low++;
m++;
}
}
}
void mergesort(int arr[],int low,int high)
{
int t,i,j;
if(high>low)
{
mergesort(arr,low,(high+low)/2); //divide
mergesort(arr,(high+low)/2+1,high);
combine(low,high,arr);
}
}
int main()
{
int i ,n;
int arr[30]={0};
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
mergesort(arr,0,n-1);
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
return 0;
}