c++归并排序_合并排序法

8685090ac6f98e9fc53fa105a9273c3d.png

一、合并排序(Merge Sort) 就是将多个有序数据表合并成一个有序数据表。如果参与合并的只有两个

有序表,那么称为二路合并。对于一个原始的待排序序列,往往可以通过分割的方法来归结为多路合

并排序。

二、一个待排序的原始数据序列进行合并排序的基本思路是,首先将含有n个结点的待排序数据序列看作有n个长度为1的有序子表组成,将他们依次两两合并,得到长度为2的若干有序子表;然后,再对这些子表进行两两合并,得到长度为4的若干有序子表; .......,重复上述过程,- -直重复到最后的子表

长度为n,从而完成排序过程。

三、例子

f6e2379368c14316ef16e0fd229b9c58.png
 ***********************************************************************/   // 归并排序,分治法的典型代表: 将原问题分解了几个子问题,解决子问题,再合并子问题的解,   // 这样就得到了原问题的解。   // 分治本质上就是把原问题分解为几个子问题来解决。   // 快速排序也是分治思想来解决。   //   //   // 归并排序(merge-sort):   // 1. 把一个待排序的数组分解为两个子数组;   // 2. 对两个子数组进行排序(通过递归地调用自己来实现);   // 3. 对两个已经排序的数组进行合并。   //   // 分析:   // 1. 一个数组一直分解下去,只到分解成只包含一个元素的子数组为止, 此时自然是有序的;   // 2. 归并排序的重点在于合并,而不是对子数组的排序。(快速排序与它恰恰相反,快速排序的   // 重点是对子数组进行排序,而不是合并,因为它不需要合并了)   //   //   
#include <cstring>   
#include <iostream>   
typedef bool(*CompareFunc)(int, int);      // 下面函数实现合并功能,输入三个下标参数表示了两个子数组, :[nStart_, nMiddle)和[nMiddle, nEnd)   
void Merge(int array[], int nStart_, int nMiddle_, int nEnd_, CompareFunc comp)   {          
if (array == nullptr || nStart_ >= nMiddle_ || nMiddle_ >= nEnd_)           
return;              // 建立一个临时数组存放中间数据       
int _nIndex = 0;        
int* _pTempArray = new int[nEnd_ - nStart_];              // 对两个子数组进行合并       
int _nStartChange = nStart_;       
int _nMiddleChange = nMiddle_;       
while (_nStartChange < nMiddle_ && _nMiddleChange < nEnd_)       {           // 此处的if中比较语句的安排可以保持稳定排序的特性。           
if (comp(array[_nMiddleChange],  array[_nStartChange]))           
{               
_pTempArray[_nIndex] = array[_nMiddleChange];              ++_nMiddleChange;           }           
else           {               
_pTempArray[_nIndex] = array[_nStartChange];               
++_nStartChange;           }           
++_nIndex;       }              // 把不为空的子数组的元素追加到临时数       
if (_nStartChange < nMiddle_)       {           
memcpy(_pTempArray + _nIndex, array + _nStartChange, sizeof(int) * (nMiddle_ - _nStartChange));       }       
else if (_nMiddleChange < nEnd_)       {           
memcpy(_pTempArray + _nIndex, array + _nMiddleChange, sizeof(int) * (nEnd_ - _nMiddleChange));       }       
else       {           /* do noting */       }          // 数据交换      memcpy(array + nStart_, _pTempArray, sizeof(int) * (nEnd_ - nStart_));          
delete [] _pTempArray;       _pTempArray = nullptr;   }      // 归并排序功能实现函数   
void MergeSort(int array[], int nStart_, int nEnd_, CompareFunc comp)   {       // 数组指针为空,或者数组内的个数少于等于1个时,直接返回。       
if (nullptr == array ||  (nEnd_ - nStart_) <= 1)          return;          // 划分为两个子数组并递归调用自身进行排序       
int _nMiddle = (nStart_ + nEnd_) / 2;       
MergeSort(array, nStart_, _nMiddle, comp);       
MergeSort(array, _nMiddle, nEnd_, comp);          // 合并排序完成的子数组       
Merge(array, nStart_, _nMiddle, nEnd_, comp);   }      // 比较函数   
bool less(int lhs, int rhs)   {       
return lhs < rhs;   }      // 打印数组函数   
void PrintArray(int array[], int nLength_)   {      if (nullptr == array || nLength_ <= 0)           
return;         for (int i = 0; i < nLength_; ++i)       {           
std::cout << array[i] << " ";       }          
std::cout << std::endl;   }      /***************    main.c     *********************/ >>
int main(int argc, char* argv[])   {       // 测试1       
int array[10] = {1, -1, 1, 231321, -12321, -1, -1, 123, -213, -13};      PrintArray(array, 10);       
MergeSort(array, 0, 10, less);      PrintArray(array, 10);          // 测试2      
int array2[1] = {1};       PrintArray(array2, 1);      MergeSort(array2, 0, 1, less);       
PrintArray(array2, 1);          // 测试3       
int array3[2] = {1, -1};      PrintArray(array3, 2);       
MergeSort(array3, 0, 2, less);       
PrintArray(array3, 2);          
return 0;   } 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微习惯虽好,但是最重要的还是坚持

2019独角兽企业重金招聘Python工程师标准>>> “微习惯”一词是由美国的斯蒂芬盖斯提出的。他以前是个宅男&#xff0c;懒虫&#xff0c;为了改变自己而找到了这个方法。并且在自己身上实验成功。养成了好的读书、写作和健身的习惯&#xff0c;实现了人生的华丽转身。…

带你了解zabbix整合ELK收集系统异常日志触发告警~

今天来了解一下关于ELK的“L”-Logstash,没错&#xff0c;就是这个神奇小组件&#xff0c;我们都知道&#xff0c;它是ELK不可缺少的组件&#xff0c;完成了输入&#xff08;input&#xff09;&#xff0c;过滤&#xff08;fileter&#xff09;&#xff0c;output&#xff08;输…

用python设计学生管理系统_Python实现GUI学生信息管理系统

本文实例为大家分享了Python实现GUI学生信息管理系统的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 项目环境&#xff1a; 软件环境: OS:RedHat6.3 Lib:Pygtk Language:Python Support tool:Glade3 项目简述&#xff1a; ①Glade3设计用户的登录窗口&#xff0c;功…

python理论知识选择题_Python基础自测题答案和基础知识梳理

Python基础自测题答案和基础知识梳理 1.关于Python中的lambda表达式的函数体自能是单独一条语句&#xff0c;所以答案选择C。 例如&#xff1a;>>>g lambda x: 2*x1 g(3) 7 2.Python中的变量不需要事先声明&#xff0c;但是需要创建和赋值&#xff0c;否则你怎么用&a…

查找算法之顺序查找

参考&#xff1a; 1. 顺序查找 | 博客园 基本思想&#xff1a; 顺序查找&#xff0c;就是从第一个元素开始&#xff0c;按索引顺序遍历待查找序列&#xff0c;直到找出给定目标或者查找失败。 特点&#xff1a; 1. 对待查序列&#xff08;表&#xff09;无要求 -- 待查找序列可…

python数据预测_python时间序列预测股票走势

提示&#xff1a;这只是个训练模型&#xff0c;技术不具备实际意义&#xff0c;入市需谨慎。 首先调用tushare包 import tushare as ts import pandas as pd import matplotlib.pyplot as plt 查自己比较感兴趣的股票&#xff0c;这里我查找的是新能源/燃料电池/氢燃料&#xf…

30.Android之百度地图简单学习

今天用了下百度地图&#xff0c;简单写了一个例子&#xff0c;记录下。 一、申请AK&#xff08;API Key&#xff09; 要想使用百度地图sdk&#xff0c;就必须申请一个百度地图的api key。申请流程挺简单的。 首先注册成为百度的开发者&#xff0c;然后打开http://lbsyun.baidu.…

python爬取b站弹幕_爬取B站弹幕并且制作词云

目录 SRE实战 互联网时代守护先锋&#xff0c;助力企业售后服务体系运筹帷幄&#xff01;一键直达领取阿里云限量特价优惠。 爬取弹幕 1. 从手机端口进入网页爬取找到接口 2.代码 import requests from lxml import etree import numpy as np urlhttps://api.bilibili.com/x/v1…

python控制灯_Python 控制树莓派 GPIO 输出:控制 LED 灯

树莓派 GPIO 控制输出的入门应该都是从控制 LED 灯开始的吧。 树莓派版本&#xff1a;Model 3B 树莓派系统&#xff1a;Raspbian Stretch with desktop and recommended software&#xff0c;April 2019 连接装置 准备一个 LED 灯&#xff0c;两个两头都为母的杜邦线。对照下图…

报错型sql注入原理分析

0x00&#xff1a;前言关于sql注入&#xff0c;经久不衰&#xff0c;现在的网站一般对sql注入的防护也相对加强了&#xff0c;2016年的***测试报告中&#xff0c;出现最多的是xss&#xff08;跨站脚本***&#xff09;和明文传输等&#xff0c;但是对sql注入的利用方式&#xff0…

matlab矩阵 0,matlab zeros初始化为0矩阵

zeros为创建一个值为零的数组&#xff1b;如matrix1zeros(4,5);%4*5的矩阵&#xff0c;矩阵中每个元素都为0matrix2zeros(4,5,3);%4*5*3的数组&#xff0c;数组中每个元素都为0下面举一个将图像存到数组的例子对RGB图片1.jpg&#xff0c;2.jpg&#xff1b;大小为700*500*3创建4…

批处理命令Start

2019独角兽企业重金招聘Python工程师标准>>> 运行hello.exe&#xff08;最小化&#xff09; start /MIN hello.exe 用记事本打开readme.txt&#xff08;最大化&#xff09; start /MAX notepad readme.txt 打开网页 start http://www.baidu.com/ 调用另外一个脚本&…

arcgis python实例_arcgis二次开发_arcgis二次开发python_arcgis二次开发实例

[1.rar] - QQ连连看的源码.单消秒杀挂机等功能喜欢的朋友请拿去研究 [qqCHAR.rar] - qq 验证码识别程序 可以叫准确的识别出qq登陆前的验证码 [1.rar] - 本书以Visualc作为开发语言&#xff0c;结合大量实例&#xff0c;详细介绍了利用Arcobjects组件进行GIS二次开发的方法和过…

Linux命令-自动挂载文件/etc/fstab功能详解

一、/etc/fstab文件的作用磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab这个文件中&#xff0c;否则下次开机启动时仍然需要重新挂载。系统开机时会主动读取/etc/fstab这个文件中的内容&#xff0c;根据文件里面的配置挂载磁盘。这样我们只需要将磁盘的挂载信息写入这个文…

一、在windows环境下修改pip镜像源的方法(以python3为例)

在windows环境下修改pip镜像源的方法(以python3为例) 1.在windows文件管理器中,输入 %APPDATA% 2.会定位到一个新的目录下&#xff0c;在该目录下新建pip文件夹&#xff0c;然后到pip文件夹里面去新建个pip.ini文件 3.在新建的pip.ini文件中输入以下内容&#xff0c;搞定 [glob…

得到选择框句柄 怎么操作_电脑版微信怎么多开?最简单的三种电脑版微信多开教程...

​在现实中的我们在网络上却又很多张脸&#xff0c;多开微信很多人都是需要的&#xff0c;这里就介绍3个方法给大家多开。方法1&#xff1a;BAT文件鼠标右键单击微信图标选择 属性在属性选项夹内复制 “目标”例如我的是("D:Program Files (x86)TencentWeChatWeChat.exe&q…

macos sierra 引导镜像_真想不到,在win10上可以制作苹果macOS启动U盘

不管你使用的是macOS还是Windows10&#xff0c;电脑出现启动问题是很正常的&#xff0c;原因有很多种&#xff0c;包括(但不限于)文件损坏、硬件故障和错误更新等。如果意外发生在苹果电脑上&#xff0c;可以使用带有安装文件的macOS启动U盘来修复它。这正是在电脑正常工作时应…

python(1) - 数据类型和变量

数据类型&#xff1a; 整数&#xff1a;就是整数&#xff0c;包括正整数&#xff0c;0&#xff0c;负整数 浮点数&#xff1a; 通俗点说&#xff0c;就是小数 长整数&#xff1a; 就是比较长的整型&#xff0c;通常后面会跟一个L 字符串&#xff1a; 字符串需要用“”或’’括起…

powershell awk_谈谈 PowerShell

万事万物&#xff0c;有始有终。直从萌芽拔&#xff0c;高自毫末始。所谓的 Shell&#xff0c;无非是应用程序与操作系统内核进行交互的一个中间程序而已。我本人玩电脑也有很久一阵子了&#xff0c;最开始接触到的就是Windows 7 操作系统&#xff0c;当时 Windows 7 上市不久&…

python七段数码管的详解,Python入门基础:七段数码管绘制

1.在学习Python的过程中&#xff0c;运用所学的一些基础知识&#xff0c;进行一些简单的编程&#xff0c;可以收获很多乐趣。在生活中&#xff0c;LED灯无处不在&#xff0c;荧幕显示的广告词&#xff0c;给我们呈现出动态的视觉效果。下面&#xff0c;则以最简单的显示日期为例…