大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang

以下实现归并排序,第一部分含有哨兵(算法来自《算法导论》),第二部分不含哨兵

第一部分,含有哨兵的归并排序:

#include<iostream>
using namespace std;
 
void myMERGE(int * A, int p, int q, int r)
{
    int n1 = q - p + 2;
    int n2 = r - q + 1;
    int L[n1];
    int R[n2];
    for(int i = 0; i < n1-1; ++i)
        L[i] = A[p + i];
    L[n1-1] = INT_MAX;
    for(int j = 0; j < n2-1; ++j)
        R[j] = A[q + j + 1];
    R[n2-1] = INT_MAX;
    int i = 0;
    int j = 0;
    for(int k = p; k <= r; ++k)
       A[k] = L[i] < R[j] ? L[i++] : R[j++];
}
 
void MERGE_SORT(int *A, int p, int r)
{
    if(r > p)
    {
        int q = (r + p) / 2;
        MERGE_SORT(A, p, q);
        MERGE_SORT(A, q+1, r);
        myMERGE(A, p, q, r);
    }
}
 
int main()
{
    int b[4] = {4,3,2,1};
    MERGE_SORT(b,0,3);
    for(int i = 0; i < 4; ++i)
        cout << b[i] << endl;
 
    return 0;
}
-----------------------------------------------------

#include<iostream>
using namespace std;
 
void myMERGE(int *A, int p, int q, int r)
{
    int n1 = q - p + 2;
    int n2 = r - q + 1;
    int L[n1];
    int R[n2];
    for(int i = 0; i < n1 - 1; ++ i)
    {
        L[i] = A[p + i];
    }
    L[n1 - 1] = 0;
    for(int j = 0; j < n2 - 1; ++ j)
    {
        R[j] = A[q + 1 + j];
    }
    R[n2 - 1] = 0;
    int i = 0;
    int j = 0;
    for(int k = p; k <= r; ++k)
    {
        A[k] = L[i] > R[j] ? L[i++] : R[j++];
    }
}
 
void MERGE_DESCSORT(int *A, int p, int r)
{
    if(r > p)
    {
        int q = (r + p) / 2;
        MERGE_DESCSORT(A, p, q);
        MERGE_DESCSORT(A, q + 1, r);
        myMERGE(A, p, q, r);
    }
}
 
int main()
{
    int b[] = {1,2,3,4,5};
    MERGE_DESCSORT(b, 0, 4);
    for(int i = 0; i < 5; ++i)
    {
        cout << b[i] << endl;
    }
 
    return 0;

}

 

第二部分,不含有哨兵的归并排序:

#include<iostream>
using namespace std;
 
void myMERGE2(int *A, int p, int q, int r)
{
    int n1 = q - p + 1;
    int n2 = r - q;
    int L[n1];
    int R[n2];
    for(int i = 0; i < n1; ++i)
        L[i] = A[p + i];
    for(int j = 0; j < n2; ++j)
        R[j] = A[q + 1 + j];
    int i = 0;
    int j = 0;
    int k = p;
    while(i < n1 && j < n2)
        A[k++] = L[i] < R[j]?L[i++]:R[j++];
    while(i < n1)
        A[k++] = L[i++];
    while(j < n2)
        A[k++] = R[j++];
}
 
void MERGE_SORT2(int *A, int p, int r)
{
    if(p < r)
    {
        int q = (r + p) / 2;
        MERGE_SORT2(A, p, q);
        MERGE_SORT2(A, q + 1, r);
        myMERGE2(A, p, q, r);
    }
}
 
int main()
{
    int b[] = {5,4,3,2,1};
    MERGE_SORT2(b,0,4);
    for(int i = 0; i < 5; ++i)
        cout << b[i] << endl;
 
    return 0;
}

MERGE_SORT归并排序C++实现的更多相关文章

  1. Open Data Structure Templates

    数据结构模板 Chen 2016/12/22 前言 本篇博客的模板,全部是我纯手打的,如果有发现错误,请在下方留言指正:).欢迎大家参考. 有一些地方还不是很完善,等过一阵子用C++实现和部分重构下. ...

  2. DataStructure 排序 源码实现

    本篇博客实现了 1.冒泡排序 2.冒泡排序的一种优化(当某次冒泡没有进行交换时,退出循环) 3.选择排序 4.归并排序 5.快速排序. 主要是源码的实现,并将自己在敲的过程中所遇到的一些问题记录下来. ...

  3. Noip2018 考前准备

    目录 基础算法 二分 模拟(未补) 高精(未学习) 搜索(未补) 排序 图论 树的直径 树的重心 最短路算法 Spfa Dijkstra Floyd 最小生成树 kruskal 数论 线性筛 线性筛素 ...

  4. 疯子的算法总结(六) 复杂排序算法 ① 归并排序 merge_sort()

    归并排序采取了分治的思想,每次分别排左半边和右半边,不断递归调用自己,直到只有一个元素递归结束,开始回溯,调用merge函数,合并两个有序序列,再合并的时候每次给末尾追上一个最大int这样就不怕最后一 ...

  5. 归并排序merge_sort

    将区间递归分解,直到区间只有2个元素,然后比较大小,排序,等递归回来的时候就将排序好的子区间再排序合并....一直排序合并,最后就排序完成了. (可以做范围大的逆序数的题) #include < ...

  6. 归并排序(Merge_Sort)

    基本思想 建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 算法原理 归并操作指的是将两个已经排序的序列合并成一个序列的操作,归并 ...

  7. [算法]——归并排序(Merge Sort)

    归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...

  8. 二路归并排序算法实现-完整C语言程序

    /*********************************************************************************************** 1.设 ...

  9. HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)

    题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS     Memory Limit: 32768 K Description The inve ...

随机推荐

  1. MyEclipse安装Eclipse Memory Analyzer插件,并进行错误文件分析流程

    在看深入JVM虚拟机一书(p50,2.4 实战OutOfMemoryError),有一个Java堆溢出的例子,使用到了Eclipse Memory Analyzer插件,由于自己现在使用的是MyEcl ...

  2. [TYVJ] P1003 越野跑

    越野跑 背景 Background 成成第一次模拟赛 第二道     描述 Description     为了能在下一次跑步比赛中有好的发挥,贝茜在一条山路上开始了她的训练.贝茜希望能在每次训练中跑 ...

  3. Effective Java提升Code Coverage代码涵盖率 - 就是爱Java

    虽然我们已经有了测试程序,但是如何得知是否已完整测试了主程序?,透过Code Coverage代码涵盖率,我们可以快速地得知,目前系统中,有多少程序中被测试过,不考虑成本跟投资效益比,涵盖率越高,代表 ...

  4. HDU 2222 Keywords Search (AC自动机)

    题意:就是求目标串中出现了几个模式串. 思路:用int型的end数组记录出现,AC自动机即可. #include<iostream> #include<cstdio> #inc ...

  5. 统计维护<第四篇>

    SQL Server允许用户手工地控制单独数据库中的统计维护.SQL Server的4个主要的控制紫铜统计的维护的配置如下: 在无索引的列上新建统计(自动创建统计): 更新现有统计(自动更新统计): ...

  6. 《Programming WPF》翻译 第7章 4.转换

    原文:<Programming WPF>翻译 第7章 4.转换 支持高分辨率显示是WPF中的重要样式.这是被部分地支持--强调了可伸缩的向量图,而不是图像.但是,正如使用GDI+和GDI3 ...

  7. Array vs Linked List

    Access: Random / Sequential 1. Array element can be randomly accessed using index 2. Random access f ...

  8. 《Two Days DIV + CSS》读书笔记——CSS控制页面方式

    1.1 你必须知道的知识 (其中包括1.1.1 DIV + CSS的叫法解释:1.1.2 DIV + CSS 名字的误区:以及1.1.3 W3C简介.由于只是背景知识,跳过该章.) 1.2 你必须掌握 ...

  9. 《招聘一个靠谱的iOS》面试题参考答案(上)

    说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:<招聘一个靠谱的 iOS>,其中共55题,除第一题为纠错题外,其他54道均为简答题. 博文中给出了高质量的面试题,但是未给出答案, ...

  10. iOS 3DES加密 和 java 3DES 解密

    首先进入头文件: #import <CommonCrypto/CommonDigest.h> #import <CommonCrypto/CommonCryptor.h> #i ...