基于归并排序解决该问题
#include<stdio.h>
void pai(int nums[],int temp[],int start,int middle,int end)
//temp数组用于暂时存储排列好的数组
{
int p=start;
int i=start,j=middle+1;
while(i<=middle&&j<=end)
{
if(nums[i]>nums[j]) //i所对应数值大于j所对应的数值,那就将nums[j]插入temp数组
{
temp[p++]=nums[j++];
}
else
{
temp[p++]=nums[i++];
}
}
while(i<=middle) //将剩余较大数插入temp数组
{
temp[p++]=nums[i++];
}
while(j<=end)
{
temp[p++]=nums[j++];
}
for(int i=start;i<=end;i++) //来把temp数组返回到nums
{
nums[i]=temp[i];
}
}
void dfs(int nums[],int temp[],int start,int end)
{
if (start >= end) {
return;
}
else
{
int middle=(start+end)/2;
dfs(nums,temp,start,middle); //折半进行排序
dfs(nums,temp,middle+1,end);
pai(nums,temp,start,middle,end); //折半调用
}
}
int main()
{
int sum;
int nums[100001];
scanf("%d",&sum);
for(int i=0;i<sum;i++)
{
scanf("%d",&nums[i]);
}
int temp[100001];
int start=0,end=sum-1;
dfs(nums,temp,start,end);
for(int i=0;i<sum;i++)
{
printf("%d",nums[i]);
if(i!=sum-1)
{
printf(" ");
}
}
}