归并排序的思想
第一步:先找出一个中间量 mid = (L+R)/2, 将序列分成两部分
第二步:利用递归,将两部分分别排好序
第三步:利用双指针思想,将两部分整合在一块
下面是具体代码模板
#include<iostream>
using namespace std;
const int N = 1000010;
int n ;
int q[N], tmp[N];
void merge_sort(int q[], int l, int r)
{
if(l >= r) return ; //如果只有一个那无需排序
int mid = r + l >> 1 ;
merge_sort(q, l ,mid), merge_sort(q, mid+1, r);//递归排序
int k = 0, i = r , j = mid + 1;
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++];
for(int i = l, j= 0 ;i<=r; i++, j++ ) q[i] = tmp[j];
}