归并排序是采用分治的原理
将一个数组平均分成两段
分别用两个指针指向两段的第一个元素
比较两个指针所指向的元素的大小
将小的元素放到一个数组中,同时对应指针向右移动一位
依次进行比较
当其中一个指针移动到末尾时结束
与快排不同的是,这个要先递归
代码如下
int q[N],tmp[N];
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 k = 0, i = l, j = mid + 1;
while(l <= 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(i = l,j =0;i <= r; i ++, j ++) q[i] = tmp[j];//将tmp还给q
}