1、确定分界点 mid = (l + r)/2
2、递归排序
3、合并两个排好序的区间 (重点)(注意:长度为2可以看做两个排好序长度为1的序列)
#include <iostream>
using namespace std;
void mergesort(int *a, int l, int r) {
if(l >= r) return;
int mid = (l + r) >> 1;
mergesort(a, l, mid);
mergesort(a, mid + 1, r);
int b[r-l+1];
int lptr = l, rptr = mid + 1;
int cnt = 0;
while(lptr <= mid && rptr <= r) {
if (a[lptr] <= a[rptr]) {
b[cnt++] = a[lptr++];
}
else{
b[cnt++] = a[rptr++];
}
}
while(lptr <= mid) {
b[cnt++] = a[lptr++];
}
while(rptr <= r) {
b[cnt++] = a[rptr++];
}
for (int i = 0; i < r - l + 1; i++) {
a[i + l] = b[i];
}
}
int main() {
int a[8] = {4, 4, 5, 1, 2, 2, 9, 8};
mergesort(a, 0, sizeof(a)/sizeof(a[0]) - 1);
for(auto i:a) {
cout << i << ' ';
}
}
合并区间的过程: