归并排序本质上是双指针排序,核心操作主要是把数组一分为二递归以及将两个有序的数组归并成一个有序的数组。详细请看下面的代码
/**
* 1. 确定分界点mid = (L + R) / 2,先递归处理:以中间点来分数组
* 2. 递归排序left,right
* 3. 归并:合二为一,把两个有序的数组合并成一个有序的数组
* 两个指针,两个数组,指针指向当前数组的最小值,然后两个指针比较,
* 直到有一个指针到终点
*
* 双指针算法
* 时间复杂夫O(nlogn)
**/
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
int a[N];
void merge_sort(int l, int r){
if (l >= r) return;
int mid = (l + r) / 2;
merge_sort(l, mid);
merge_sort(mid + 1, r);
int i = l, j = mid + 1, tem[r - l + 1], k = 0;
while (i <= mid && j <= r){
if (a[i] <= a[j]) tem[k++] = a[i++];
else tem[k++] = a[j++];
}
while (i <= mid) tem[k++] = a[i++];
while (j <= r) tem[k++] = a[j++];
for (int i = l, j = 0; j < k; i++, j++){
a[i] = tem[j];
}
}
int main(){
int n;
cin >> n;
for (int i = 0; i < n; i++){
cin >> a[i];
}
merge_sort(0, n -1);
for (int i = 0; i < n; i++){
cout << a[i] << ' ';
}
return 0;
}