归并排序模板

Posted WKWKSL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序模板相关的知识,希望对你有一定的参考价值。

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 l = L; int r = mid + 1;
    int n = 0;
    while (l <= mid && r <= R)
    
        if (q[l] < q[r])
            Temp[n++] = q[l++];
        else
            Temp[n++] = q[r++];
    
    while (l <= mid)Temp[n++] = q[l++];
    while (r <= R)Temp[n++] = q[r++];
    for (int i = L,j = 0; L <= R;L++,j++)//数据导入
        q[L] = Temp[j];

注意归并排序需要额外一个数组Temp来暂时存储结果

注意归并的for循环还有while里不要多写++,否则会出错误的

 

常用算法模板 | 归并排序



为信竞同学整理的常用算法模板



归并排序 



 1void merge_sort(int q[], int l, int r){
2    //如果只有一个元素,则递归终止
3    if (l == r) return;                       
4
5    //选取中点,将数组二分
6    int mid = l + r >> 1;                     
7    //将左侧数组排序
8    merge_sort(q, l, mid);                    
9    //将右侧数组排序
10    merge_sort(q, mid + 1, r);                
11
12    //i,j双指针
13    int k = l, i = l, j = mid + 1;            
14    //归并数组
15    while (i <= mid && j <= r){               
16        //“<=”保证稳定排序
17        if (q[i] <= q[j]) tmp[k++] = q[i++];  
18        else tmp[k++] = q[j++];
19    }
20
21    //左侧还有剩余元素
22    while (i <= mid) tmp[k++] = q[i++];       
23    //右侧还有剩余元素
24    while (j <= r) tmp[k++] = q[j++];         
25
26    for (int i = l;i <= r; i++) q[i] = tmp[i];
27}

时间复杂度:O(nlogn)
空间复杂度:O(N),需要一个与原数组相同长度的数组做辅助
稳定性:归并排序是稳定的排序算法

以上是关于归并排序模板的主要内容,如果未能解决你的问题,请参考以下文章

归并排序模板

归并排序模板

常用算法模板 | 归并排序

归并排序求逆序对模板(未完待续)

C++归并排序求逆序对_模板

Luogu 1177 - 模板快速排序 - [快速排序][归并排序][无旋Treap]