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,一经查实,立即删除!

相关文章

golang json数组拼接

2016年06月16日 15:38:25 阅读数&#xff1a;2575 标签&#xff1a; golang json 数组 更多 个人分类&#xff1a; golang func main() {a : []byte({"Parents": [ "aaaaa", "bbbbbbb" ]})b : []byte({"Parents": [ "Gomez"…

php课程设计实验心得,PHP程序设计教程实验及课程设计

部分 教程1 基础教程1.1 简介1.2 WampServer安装1.3 PHP语法1.4 变量1.5 echo和print语句1.6 数据类型1.7 字符串函数1.8 常量1.9 运算符1.10 条件语句1.11 Switch语句1.12 循环语句1.13 函数部分 教程1 基础教程1.1 简介1.2 WampServer安装1.3 PHP语法1.4 变量1.5 echo和print…

DRUID连接池的简单使用

DRUID——为监控而生的DB池 1. DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现&#xff0c;它结合了C3P0、DBCP、PROXOOL等DB池的优点&#xff0c;同时加入了日志监控&#xff0c;可以很好的监控DB池连接和SQL的执行情况&#xff0c;可以说是针对监控而生的DB连接池…

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

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

php手机端多图预览上传,JS实现多图预览上传的实例代码

这篇文章主要介绍了JS实现多张图片预览同步上传功能的相关资料,需要的朋友可以参考下废话不多说了&#xff0c;直接给大家贴代码了&#xff0c;具体代码如下所示&#xff1a;/*** Created by liujing on 2017/5/10.*/$(document).ready(function($) {function changef(which,bu…

带你了解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;功…

http响应头设置

protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 设置响应头数据response.setHeader(null, "HTTP/1.1 200 OK");response.setHeader("Server", "Apache-Coyote/1.1"…

java用数组实现单词计数,MapReduce实现单词计数原理及Java编程:WordCount

MapReduce实现单词计数&#xff1a;WordCount单词计数的文本信息(hello.txt)&#xff1a;hello can i help youi have a dreammaybe you can help me​ 实现过程&#xff1a;​ Map过程&#xff1a;并行读取文本&#xff0c;对读取的单词进行Map操作&#xff0c;每个词将会形成…

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

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

STM32f4 ARM Bootloader

参考资料&#xff1a; 基于ARM 的嵌入式系统Bootloader 启动流程分析 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计) Android系统启动流程 -- bootloader 在main()之前&#xff0c;IAR都做了啥&#xff1f; STM32 IAP程序 源码 和测试代码 有详细的…

查找算法之顺序查找

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

matlab kfda,SVD与KFDA相结合人脸识别-matlab-毕业论文

XXXXxx毕业设计(论文)最高达到88%。当在抽取的特征维数为39&#xff0c;PCA空间的投影维数为110的情况下&#xff0c;随着训练样本个数的增加&#xff0c;LDA的识别情况如表4所示表4 ORL人脸库LDA测试结果(2)训练样本数 识别率/% 识别时间/S3 68.2 52.3594 87.92 31.5315 88.00…

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.…

在datatable中,在指定位置插入列

假如dataset ds 里面已经存在了数据&#xff0c;当我们想在datatable中插入一列数据&#xff0c;可以用以下方法实现&#xff1a;ds.Tables[0].Columns.Add("star");ds.Tables[0].Columns["star"].SetOrdinal(0);这样“star”列就添加到datatable的第一列了…

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

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

myeclipse始终build workspace

之前我的myeclipse运行某个项目的时候&#xff0c;总是不停的buildworkspace&#xff0c;而且稍微改动一个(不管是java类还是jsp)都会加载接近1分钟甚至更久&#xff0c;从网上搜了好久&#xff0c;先总结下搜的多数方法 1、叫你去掉.project文件的一段话 <buildCommand>…

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

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