大家好,我是小鸭酱,博客地址为: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. 图铭Android平台银行卡号识别系统

    随着智能终端(智能手机及平板电脑)及移动通信(3G)的发展,原来运行在PC上的信息系统(如邮件系统.即时通信.网页浏览.协同办公.网络购物.社交网站.博客等)逐渐转移到智能终端设备上.可以预见未来几年 ...

  2. Android Development Tools 发生checkAndLoadTargetData错误

    之前使用时没有出现任何问题的,我把D:\IDE\ADT\adt-bundle-windows-x86_64-20140321\eclipse目录下面的 eclipse.exe重名名为adt.exe并设 ...

  3. Win8/Win8.1都有哪些版本?我该选择哪个?(二)

    Windows版本分类比较复杂,下文主要为大家理清Win8/Win8.1的版本种类.如果想了解更多,可以结合<Win7/Win8/Win8.1众多版本,我该选择哪个?>一文来了解. 细数W ...

  4. nyoj 36 最长公共子序列

    描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subseque ...

  5. [bzoj1003][ZJOI2006][物流运输] (最短路+dp)

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  6. Java连接Oracle数据库的示例代码

    最基本的Oracle数据库连接代码(只针对Oracle11g): 1.右键项目->构建路径 ->配置构建路径,选择第三项“库”,然后点击“添加外部Jar”,选择 “D:\Oracle\ap ...

  7. qt 操作excel表格

     自己编写的一个Qt C++类,用于操作excel表格,在Qt中操作excel需在.pro中增加CONFIG+=qaxcontainer配置. 1.打开Excel:objExcel = new QAx ...

  8. ThinkPHP视图查询详解

    ThinkPHP视图查询详解 参考http://www.jb51.net/article/51674.htm   这篇文章主要介绍了ThinkPHP视图查询,需要的朋友可以参考下     ThinkP ...

  9. iOS新的旅程之Swift语言的学习

    好久都没有来这个熟悉而又陌生的地方啦, 想想已经有两三个月了吧,不过我相信以后还是会经常来的啦,因为忙碌的学习已经过去啦,剩下的就是要好好的总结好好的复习了,好好的熟悉下我们之前学习的知识点,将他们有 ...

  10. 执行update操作的话,就会报“Connection is read-only. Queries leading to data modification are not allowed”的异常。

    我用的是 spring + springmvc + mybatis +mysql. <tx:advice id="txAdvice" transaction-manager= ...