题目描述
二路归并排序(mergesort)递归法
用递归法进行二路归并排序
输入:第一行一个数据n,表示有n个数要排序。接下来n行每行一个<=10^7的整数。
输出:n行,由小到大排序后的数据
数据规模:n<=10^5
思考:两个递归都会被执行吗?
代码
#include<stdio.h>
#include<string.h>
using namespace std;
int a[200000];
void merge(int a[], int l1, int r1, int l2, int r2) {
int i = l1, j = l2;
int temp[400000], index = 0;//用于临时存放合并后的数组
while (i <= r1 && j <= r2) {
if (a[i] <= a[j]) temp[index++] = a[i++];
else temp[index++] = a[j++];
}
while (i <= r1) temp[index++] = a[i++];
while (j <= r2) temp[index++] = a[j++];
for (int i = 0; i < index; i++) a[l1 + i] = temp[i];
}
void mergeSort(int a[], int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(a, left, mid);
mergeSort(a, mid + 1, right);
merge(a, left, mid, mid + 1, right);
}
}
int main() {
int n;
while (scanf("%d", &n)) {
memset(a, 0, sizeof(a));
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
mergeSort(a, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d\n", a[i]);
}
}
return 0;
}