第七章 ALDS1_5_B:Merge Sort 归并排序

来源:互联网 发布:好听淘宝名字大全 编辑:程序博客网 时间:2024/06/07 03:58

知识点

归并排序

  • 基本操作
    • 分割(Divide):将n个元素分割成两个局部数组,每个数组各含有n/2个元素
    • 排序(Sort):对两个局部数组进行排序
    • 合并(Conquer):将两个已经排序完毕的局部数组“整合”成一个数组
  • 性质
    • 时间复杂度:O(nlogn)
    • 空间复杂度:O(n) , 需要格外添加两个局部数组
    • 稳定排序
  • 操作重点
    • 分割过程是用递归方式
    • 为了简化实现,我们在两个局部数组最后添加一个比较大的数,方便合并步骤

问题链接

ALDS1_5_B:Merge Sort

问题内容

执行归并排序,输出排序后的结果,并输出排序过程中比较运算的次数

思路

实现归并排序

代码

#include<iostream>#include<cstdio>using namespace std;const int MAX = 500000;const int maxnum = 1000000010;// 两个局部数组int L[MAX / 2 + 2], R[MAX / 2 + 2];int A[MAX], n;int cnt = 0;// 排序和合并void merge(int left, int mid, int right) {    int n1 = mid - left;    int n2 = right - mid;    for (int i = 0; i < n1; i++) L[i] = A[left + i];    for (int i = 0; i < n2; i++) R[i] = A[mid + i];    // 两个局部数组最后添加一个比较大的数    L[n1] = R[n2] = maxnum;    int i = 0, j = 0;    // 合并    for (int k = left; k < right; k++) {        cnt++;        if (L[i] <= R[j])            A[k] = L[i++];        else            A[k] = R[j++];    }}// 分割void mergeSort(int left, int right) {    if (left + 1 < right) {        int mid = (left + right) / 2;        mergeSort(left, mid);        mergeSort(mid, right);        merge(left, mid, right);    }}int main() {    scanf("%d", &n);    for (int i = 0; i < n; i++)        scanf("%d", &A[i]);    mergeSort(0, n);    for (int i = 0; i < n; i++)        printf("%d%c", A[i], i == n - 1 ? '\n' : ' ');    printf("%d\n", cnt);    return 0;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 卡玛帕尼 led帕灯灯珠 led帕灯租赁价格 led帕灯架子 帕克 托尼帕克 帕克7 彼得帕克 帕克打麻将 贾巴里帕克 肖恩帕克 纳尔帕克 托尼帕克7 罗伯特帕克 帕克7代 帕克探测器 坎迪斯帕克 托尼-帕克 贾巴里-帕克 帕克图片 帕克老婆 帕克吉诺比利共同观战 帕克吉诺比利共同观战881 帕克吉诺比利共同观战a 帕克吉诺比利共同观战1 帕克吉诺比利同观战 凯帕克禁忌第一部中文字幕 凯帕克kay禁忌手机观看 玛丽露易斯帕克 杰森斯坦森帕克高清在线播放 纳尔帕克在哪 凯帕克kay禁忌1手机观看 黄蜂裁掉帕克 奥斯帕克健身学院 贝基哈蒙和帕克 pake 帕劳 帕劳群岛 帕劳游攻略 帕劳婚纱照 帕劳7日游