题目来源:acwing
给定你一个长度为 𝑛 的整数数列。
请你使用归并排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n个整数(所有整数均在 1∼10^9 范围内),表示整个数列。
输出格式
输出共一行,包含 n𝑛 个整数,表示排好序的数列。
#include <stdio.h>
int n;
int arr[100005]; //创建数组
int temparr[100005]; //辅助数组,用于在归并时把数组中的元素进行存储
void merge_sort(int arr[],int left,int right){
if(left >= right) return; //通过递归将数组中的元素从中间分开,直到数组中只有一个元素,所以递归结束的条件是:left >= right表示数组中只有一个元素
int mid = (left + right)/2;
merge_sort(arr,left,mid);
merge_sort(arr,mid+1,right);
int i = left;
int j = mid + 1;
int k = 0;
while(i <= mid && j <= right) //合并过程中,原来分开的组就是合并时的组。并且合并过程中要先对两个组别进行比较,从各个组第一个开始,小的放到前面。在放置过程中就放到辅助数组temparr中
{
if(arr[i] < arr[j]) temparr[k++] = arr[i++];
else temparr[k++] = arr[j++];
}
while(i <= mid) temparr[k++] = arr[i++];//在放置过程中可能会有一个组没有比完,没有比完就证明这个组的数据都大,所以直接全都放到temparr的后面
while(j <= right) temparr[k++] = arr[j++];
for(int m = left,n = 0;m <= right;m++,n++){//放置完成后用辅助数组的元素替换原数组arr
arr[m] = temparr[n];
}
}
int main()
{
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d",&arr[i]);
}
merge_sort(arr,0,n-1);
for(int i = 0;i < n;i++){
printf("%d ",arr[i]);
}
return 0;
}