题目来源:acwing787题
给定你一个长度为 nn 的整数数列。
请你使用归并排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 nn。
第二行包含 nn 个整数(所有整数均在 1∼1091∼109 范围内),表示整个数列。
输出格式
输出共一行,包含 nn 个整数,表示排好序的数列。
数据范围
1≤n≤100000
我的答案:
#include<stdio.h>
const int N = 100010;
void merge_sort(int q[], int l,int r);
int main()
{
int n,q[N];
scanf("%d",&n);
int i;
for(i = 0;i < n;i ++) scanf("%d",&q[i]);
merge_sort(q,0,n-1);
for(i = 0;i < n;i ++)printf("%d ",q[i]);
return 0;
}
void merge_sort(int q[], int l,int r)
{
if(l >= r) return;
// ///
printf("排序\n");
int h;
for(h = 0; h <= r; h ++)
{
printf("-%d- ",q[h]);
}
//这几行为了多输出一点东西来看看归并时 是怎么进行的
// //
int mid = l + r >> 1,i = l, j = mid + 1;
int tmp[N];
merge_sort(q,l,mid);
merge_sort(q,mid + 1,r);
int k = 0;
while(i <= mid && j <=r)
{
if(q[i] <= q[j]) tmp[k ++] = q[i ++];
else tmp[k ++] = q[j ++];
}
while(i <= mid) tmp[k ++] = q[i ++];
while(j <= r) tmp[k ++] = q[j ++];
for(i = l,j = 0;i <= r;i ++,j ++) q[i] = tmp[j];
}
可以看到,先递归到1 3 5 7又递归到1 3,排完1 3 返回上一层,排完 5 7返回上一层,递归到8 6 4 2,又递归 8 6 排完8 6 递归到 6 8 4 2 排完4 2 就完成了 最后得到结果1 2 3 4 5 6 7 8