步骤
- 确定分界点
mid = l + r >> 1
- 递归排序左边和右边
- 归并,使其合二为一
void merge_sort(int q[], int l, int r)
{
if(l >= r) return;
int mid = l + r >> 1;
merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
int i = l, j = mid + 1, 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++];
// 每次循环都是 [l, r],j从0开始
for(i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j];
}