自然归并排序 c++ (原创)
今天复习算法, 自然归并算法令我挺感兴趣,结果网上找到的基本都不怎么准确,下面通过自己的一些修改,贴出一份正确的代码!
自然归并中,有一些已经自然排好序的序列,我们称其为有序子序列!
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++ (原创)相关推荐
- 算法篇-2-分治思想-棋盘覆盖归并排序Strasssen矩阵乘法循环赛安排
本系列所有代码https://github.com/YIWANFENG/Algorithm-github 分治思想 分治法基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些问题互相独立且与 ...
- 算法学习————自然归并算法(c/c++)
自然归并算法实现(c/c++) 前言:由于归并算法的资料已经很多了,本文主要讲述的是自然归并算法 自然归并算法VS归并算法 自然归并算法实际上是归并算法的一个变型. 例如在下文实例代码中的数组a中的元 ...
- C++(数据结构与算法):60---分而治之、分而治之应用(残缺棋盘、归并排序、快速排序、选择问题、相距最近的点对)、分而治之解递归方程、复杂度的下限
一.分而治之的思想 分而治之方法与软件设计的模块化方法非常相似 分而治之通常不用于解决问题的小实例,而要解决一个问题的大实例.一般步骤为: ①把一个大实例分为两个或多个更小的实例 ②分别解决每个小实例 ...
- armv8 汇编 绝对地址赋值_ARMv8带来的变化
前面的系列文章在讲解ARM汇编语言的时候,穿插了一些对ARMv8相较于前代处理器变化的描述,但还有一些改动和演进未曾提及,本文将继续展现这部分内容. [任我行的PC] 在x86架构中,直接修改IP(I ...
- 《小鸡快跑》的成功故事
文 / 刘江 一只来自中国的"小鸡",在亿万应用的竞赛中,跑在前列.笔者深入发掘,为你带来"小鸡"成功背后的精彩故事. 我习惯隔几天就在iPad上浏览美国区Ap ...
- 淘宝天猫京东拼多多抖音苏宁1688等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)
淘宝天猫京东拼多多抖音苏宁1688等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)代码对接如下: 1.公共参数 名称 类型 必须 描述 key String 是 调用key(必须以 ...
- 淘宝天猫京东拼多多等平台关键词监控价格API接口(店铺商品价格监控API接口代码对接展示)
淘宝天猫京东拼多多抖音苏宁1688速卖通亚马逊淘特等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)代码对接如下: 1.公共参数 名称 类型 必须 描述 key String 是 调 ...
- Keystore密钥库
近来由于项目需要做Single Sign On, 研究了一下CAS(具体配置等下篇再介绍), 而这个CAS的配置最关键的不是CAS本身,而是数字证书,如何配置多台服务器之间的信任链接.因此,有必要把k ...
- wps 字体对系统无效_“字体”侵权,你是否也中招?
"字体"侵权,你是否也中招? 1.计算机字体 只要是计算机的文字显示或者输出就离不开字体,通常在使用Word或者WPS编辑文档对文字字体设置,如"黑体".&qu ...
最新文章
- python中文软件-Python编程软件下载
- serialVersionUID的作用(转)
- HDU1247Hat’s Words(字典树)
- 一、搭建Python环境和安装Pycharm
- 《剑指offer》字符流中第一个不重复的字符
- 第二篇 服务消费者(rest ribbon)(Finchley版本)V2.0_dev
- Android开发基础(四大组件及Intent)
- 20-21-2网络管理quiz4
- android 通知栏样式_Android通知样式
- Sun发布MySQL 5.4 响应速度提升90% ?
- OpenCV C++案例实战二十三《网孔检测》
- linux firefox 插件开发教程,Firefox插件(plugins)开发实用指南
- SONET和SDH技术简介
- 第一代电子计算机使用的逻辑部件是( ),第一代电子计算机使用的逻辑部件是
- 普通浏览器打开微信页面出现验证的解决方法
- Python中的取模运算方法
- C++实现动态烟花,噼里啪啦过新年啦
- chrome谷歌浏览器调试微信H5页面
- opencv图片矩形网格边线_图像算法在数值计算中的应用(1):Canny边缘检测算法...
- 【2022】小伙用爬虫整理了自己十年的动态(爬虫保姆级教程)
热门文章
- vb计算机水平考试笔试,2014计算机考试二级VB笔试答题技巧汇总
- QML和C++混合编程--(一)
- 因为在此系统上禁止运行脚本。有关详细信息_在弃用11年后微软终于允许IT管理员禁用IE中的JScript脚本引擎...
- 为什么读博士以及有什么意义
- 条件随机场(CRF)相对于HMM,MEMM的优势
- [CODEVS 1173] 最优贸易
- 【NOIP2013模拟9.29】Mixing Chemicals
- 魔法照片pascal程序
- AtCoder AGC030B Tree Burning
- python包含某个数字_python编程练习---有序数组中,快速查找是否包含指定数字,并返回其下标...