大家好,我是小鸭酱,博客地址为: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. HBase架构深度解析

    原文出处: DLevin(@雪地脚印_) 前记 公司内部使用的是MapR版本的Hadoop生态系统,因而从MapR的官网看到了这篇文文章:An In-Depth Look at the HBase A ...

  2. CoreData概略

    CoreData概略 分类: IOS开发2013-10-25 16:19 178人阅读 评论(0) 收藏 举报 CoreData是IOS对数据进行对象化管理的一种高效方式,提供了对数据的增.删.查.改 ...

  3. shell的数组操作

    #/bin/bash #创建数组方式1 arr[]=hello arr[]=world #创建数组方式2 arr=(hello world) #创建数组方式3 arr=([]=hello []=wor ...

  4. hex格式介绍及转bin格式的源程序

    Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量.Intel HEX文件经常被用于将程序或数据传输存储到 ...

  5. key转成pvf

    https://www.godaddy.com/help/converting-an-exported-pfx-code-signing-file-to-pvk-and-spc-files-using ...

  6. Windows资源文件里VarFileInfo的Translation(EXE的语言描述信息)

    /* The following line should only be modified for localized versions. */ /* It consists of any numbe ...

  7. SSH2.0编程 ssh协议过程实现

    之前为了自己做一套SSH,先自己实现了一套telnet.但经过这么多天的苦逼,发现以前的工作都是徒劳.ssh的协议很繁杂,核心的内容在于密码算法,而且自己很难在网上找到周全的细节讲解与详细的实现,只有 ...

  8. Makefile中使用foreach生成一类规则

    CSDN上,有朋友发帖问了这样一个问题(我按自己的理解翻译一下): 当前目录下有四个静态库文件:  liba.a libb.a libc.a libd.a.现在想将它们做成一个动态库libp.so. ...

  9. execl csv导出

    方维js方法:function export_csv() { var inputs = $(".search_row").find("input:[type!='chec ...

  10. Hibernate框架增删改查

    package cn.happy.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org ...