今天复习算法, 自然归并算法令我挺感兴趣,结果网上找到的基本都不怎么准确,下面通过自己的一些修改,贴出一份正确的代码!

  自然归并中,有一些已经自然排好序的序列,我们称其为有序子序列!

 1 void NaturalMergeSort(T aSrc[], int n) 2 { 3   T *pTmp = new T[n]; 4   int aiBreakPoint[n]; //包含各有序子序列断点 5   int iBpCnt = 0; //断点数量 6   aiBreakPoint[iBpCnt++] = 0; //aiBreakPoint[0]永远指向第一个元素 7   for (int i=0; i<n-1 ; i++ ) //扫描断点 8   { 9     if(aSrc[i] > aSrc[i+1])10      aiBreakPoint[iBpCnt++] = i + 1;11   }12    aiBreakPoint[iBpCnt++] = n-1;13 14   while(iBpCnt > 2)//直到断点数为215   {16     int i=0, iNewBpCnt = 1;17     for (i = 0; i < iBpCnt - 2; i += 2)18     {19       Merge(aSrc, pTmp, aiBreakPoint[i], aiBreakPoint[i+1], aiBreakPoint[i+2]);//相邻两个合并20 21       for (int j = aiBreakPoint[i]; j <= aiBreakPoint[i+2]; j++ ) //复制结果22         aSrc[j] = pTmp[j];23 24       aiBreakPoint[iNewBpCnt++] = aiBreakPoint[i+2];25     }26 27     if(i == iBpCnt - 2) 28       aiBreakPoint[iNewBpCnt++] = aiBreakPoint[iBpCnt-1]; //处理最后的孤立点29 30     iBpCnt = iNewBpCnt;31   }
    delete[] pTmp;32 }33 34 void Merge(T c[], T d[], int l, int m, int r)35 {36 // Merge c[l:m]] and c[m:r] to d[l:r].37   int i = l, // cursor for first segment38   j = m+1, // cursor for second39   k = l; // cursor for result40 41 // merge until i or j exits its segment42   while ((i <= m) && (j <= r))43     if (c[i] <= c[j]) d[k++] = c[i++];44     else d[k++] = c[j++];45 46 // take care of left overs47   if (i > m) for (int q = j; q <= r; q++)48     d[k++] = c[q];49   else for (int q = i; q <= m; q++)50     d[k++] = c[q];51 }

by wink.

  

转载于:https://www.cnblogs.com/winkyao/archive/2012/03/14/2396511.html

自然归并排序 c++ (原创)相关推荐

  1. 算法篇-2-分治思想-棋盘覆盖归并排序Strasssen矩阵乘法循环赛安排

    本系列所有代码https://github.com/YIWANFENG/Algorithm-github 分治思想 分治法基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些问题互相独立且与 ...

  2. 算法学习————自然归并算法(c/c++)

    自然归并算法实现(c/c++) 前言:由于归并算法的资料已经很多了,本文主要讲述的是自然归并算法 自然归并算法VS归并算法 自然归并算法实际上是归并算法的一个变型. 例如在下文实例代码中的数组a中的元 ...

  3. C++(数据结构与算法):60---分而治之、分而治之应用(残缺棋盘、归并排序、快速排序、选择问题、相距最近的点对)、分而治之解递归方程、复杂度的下限

    一.分而治之的思想 分而治之方法与软件设计的模块化方法非常相似 分而治之通常不用于解决问题的小实例,而要解决一个问题的大实例.一般步骤为: ①把一个大实例分为两个或多个更小的实例 ②分别解决每个小实例 ...

  4. armv8 汇编 绝对地址赋值_ARMv8带来的变化

    前面的系列文章在讲解ARM汇编语言的时候,穿插了一些对ARMv8相较于前代处理器变化的描述,但还有一些改动和演进未曾提及,本文将继续展现这部分内容. [任我行的PC] 在x86架构中,直接修改IP(I ...

  5. 《小鸡快跑》的成功故事

    文 / 刘江 一只来自中国的"小鸡",在亿万应用的竞赛中,跑在前列.笔者深入发掘,为你带来"小鸡"成功背后的精彩故事. 我习惯隔几天就在iPad上浏览美国区Ap ...

  6. 淘宝天猫京东拼多多抖音苏宁1688等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)

    淘宝天猫京东拼多多抖音苏宁1688等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)代码对接如下: 1.公共参数 名称 类型 必须 描述 key String 是 调用key(必须以 ...

  7. 淘宝天猫京东拼多多等平台关键词监控价格API接口(店铺商品价格监控API接口代码对接展示)

    淘宝天猫京东拼多多抖音苏宁1688速卖通亚马逊淘特等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)代码对接如下: 1.公共参数 名称 类型 必须 描述 key String 是 调 ...

  8. Keystore密钥库

    近来由于项目需要做Single Sign On, 研究了一下CAS(具体配置等下篇再介绍), 而这个CAS的配置最关键的不是CAS本身,而是数字证书,如何配置多台服务器之间的信任链接.因此,有必要把k ...

  9. wps 字体对系统无效_“字体”侵权,你是否也中招?

    "字体"侵权,你是否也中招? 1.计算机字体 只要是计算机的文字显示或者输出就离不开字体,通常在使用Word或者WPS编辑文档对文字字体设置,如"黑体".&qu ...

最新文章

  1. python中文软件-Python编程软件下载
  2. serialVersionUID的作用(转)
  3. HDU1247Hat’s Words(字典树)
  4. 一、搭建Python环境和安装Pycharm
  5. 《剑指offer》字符流中第一个不重复的字符
  6. 第二篇 服务消费者(rest ribbon)(Finchley版本)V2.0_dev
  7. Android开发基础(四大组件及Intent)
  8. 20-21-2网络管理quiz4
  9. android 通知栏样式_Android通知样式
  10. Sun发布MySQL 5.4 响应速度提升90% ?
  11. OpenCV C++案例实战二十三《网孔检测》
  12. linux firefox 插件开发教程,Firefox插件(plugins)开发实用指南
  13. SONET和SDH技术简介
  14. 第一代电子计算机使用的逻辑部件是( ),第一代电子计算机使用的逻辑部件是
  15. 普通浏览器打开微信页面出现验证的解决方法
  16. Python中的取模运算方法
  17. C++实现动态烟花,噼里啪啦过新年啦
  18. chrome谷歌浏览器调试微信H5页面
  19. opencv图片矩形网格边线_图像算法在数值计算中的应用(1):Canny边缘检测算法...
  20. 【2022】小伙用爬虫整理了自己十年的动态(爬虫保姆级教程)

热门文章

  1. vb计算机水平考试笔试,2014计算机考试二级VB笔试答题技巧汇总
  2. QML和C++混合编程--(一)
  3. 因为在此系统上禁止运行脚本。有关详细信息_在弃用11年后微软终于允许IT管理员禁用IE中的JScript脚本引擎...
  4. 为什么读博士以及有什么意义
  5. 条件随机场(CRF)相对于HMM,MEMM的优势
  6. [CODEVS 1173] 最优贸易
  7. 【NOIP2013模拟9.29】Mixing Chemicals
  8. 魔法照片pascal程序
  9. AtCoder AGC030B Tree Burning
  10. python包含某个数字_python编程练习---有序数组中,快速查找是否包含指定数字,并返回其下标...