大家好,我是小鸭酱,博客地址为: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. 自定义栈类型,具有找到站内最小元素的min函数 ,且min(),pop(),push()函数的时间复杂度为O(1)

    基本思想: // 借助一个辅助栈,入栈时,若新元素比辅助栈栈顶元素小,则直接放入辅助站 // 反之,辅助站中放入次小元素(即辅助栈栈顶元素)====保证最小元素出栈时,次小元素被保存 static c ...

  2. 迁移笔记:php截取文字的方法

    php内置函数 1. iconv iconv_set_encoding('internal_encoding', 'UTF-8'); $str; //字符串的声明 $num=iconv_strlen( ...

  3. BZOJ 1090 字符串折叠(区间DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1090 题意:字符串AAAAAAAAAABABABCCD的最短折叠为9(A)3(AB)CC ...

  4. 通过Excel来集中管理资源文件

     在支持双语或多语种项目中,常常需要编辑多个文件来添加资源项,感觉比较繁琐,所以想做一个可以集中管理资源文件的工具.借助Excel,使用Excel来记录,并且通过Excel可以进行分页分模块来规划 ...

  5. 关于Microsoft app下同义词的整理

    Windows os 以下词表达的是同一个概念 windows store app windows metro app windows modern app windows runtime app w ...

  6. 【czy系列赛】czy的后宫6 && bzoj1044 [HAOI2008]木棍分割

    题目描述 众所周知的是丧尸czy有很多妹子(虽然很多但是质量不容乐观QAQ),今天czy把n个妹子排成一行来检阅.但是czy的妹子的质量实在--所以czy看不下去了.检阅了第i个妹子会增加czy a[ ...

  7. Linux Shell脚本编程--nc命令使用详解

    linux nc命令使用详解     功能说明:功能强大的网络工具 语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>] ...

  8. [转载]C宏定义的小结

    FROM:http://blog.csdn.net/sunboy_2050/article/details/6103530 实现代码实例 程序代码: #include <stdio.h> ...

  9. 【转】vlc android 代码编译

    转自:http://blog.csdn.net/asircao/article/details/7734201 系统:ubuntu12.04代码:git://git.videolan.org/vlc- ...

  10. Hibernate框架增删改查测试类归为一个类

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