归并排序
归并排序
归并排序(Merge sort)是建立在归并操作上的一种有效排序算法,它是采用分治算法的一个典型的应用。时间复杂度为\(O(NlogN)\),代价是需要额外的内存空间。
算法理解
我们可以先看一个图
归并排序的思想:我们先对输入数组一直进行对半拆分,直到区间内只有一个元素的时候,一个元素肯定是有序数组,然后我们在依次合并两个有序数组。
算法步骤
- 对输入数组进行对半拆分,直到区间内只有一个元素
- 设定两个指针分别两个已经有序序列的起始位置
- 比较两个指针所指向的元素,相对较小的元素放到合并空间,并且指针指向下一位
- 重复步骤3的操作,直到有一个指针无指向内容
- 将另一个序列剩下的所有元素直接复制到合并空间序列尾。
代码实现
int n, a[MAXN], b[MAXN];
void msort(int l, int r){//归并排序
if(l == r) return ;
int mid = l + (r - l) / 2;//这里是二分的一个坑,如果l,r两个数很大,可能导致l+r出错。
int i = l, j = mid + 1, k = l;
msort(l,mid);
msort(mid+1,r);
while(i <= mid && j <= r){
if(a[i] <= a[j]) b[k++] = a[i++];
else b[k++] = a[j++];
}
while(i <= mid){
b[k++] = a[i++];
}
while(j <= r){
b[k++] = a[j++];
}
for(int t = l; t <= r; t++){
a[t] = b[t];
}
}