可以先看这一篇介绍
归并排序的基本思想是:
先将序列一次次分成子序列,直到子序列长度为1;
再将已有序的子序列合并,得到完全有序的序列。
可以看出归并排序运用了 分而治之的思想 。
#include <iostream>
using namespace std;
int n;
const int N = 100002;
int q[N];
int tmp[N];
void merge_sort(int q[], int l, int r) {
//如果左边界 大于或者等于又边界 直接 return
if (l >= r) return;
//找到中间值
int mid = l + r >> 1;
//递归
merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);
//归并
//temp 数组下标从0开始, 左边数组从字母l开始,右边数组从mid+1开始
int k = 0, i = l, j = mid + 1;
//两边数组下标不超过边界
while (i <= mid && j <= r)
// 如果左边的元素 小于右边的 则 把左边的放到 tmp里,指针移动
if (q[i] <= q[j]) tmp[k++] = q[i++];
//否则右边的放到tmp里 右边指针移动
else tmp[k++] = q[j++];
//会有这样的情况出现左边的 放完了 右边还有剩余的,就把右边所有的放到tmp里
while (i <= mid) tmp[k++] = q[i++];
//右边放完了 左边有剩余
while (j <= r) tmp[k++] = q[j++];
//把tmp里的全部放入到p里
for (i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j];
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &q[i]);
}
merge_sort(q, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d", q[i]);
}
return 0;
}