归并排序
(1)算法介绍
     归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用,归并排序将两个已经有序的序列合并成一个有序的序列。
     思路:假设我们有一个没有排好序的序列,那么我们首先使用分割的方法将这个序列分割成一个个已经排好序的子序列(当一个序列只有一个元素时,该序列自然是有序的)。然后再利用归并的方法将一个个有序的子序列合并成排好序的序列。
2)算法执行过程
下面就一常用的二路归并排序讲解分割和合并的过程,看下图
待排序列为:14  12  15  13  11  16
代码实现如下

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;/*该函数将数组下标范围[l1,r1]和[l2,r2]的有序序列合并成一个有序序列*/
void merge(vector<int>& nums, int l1, int r1, int l2, int r2 ) {int i = l1;                                               //左半部分起始位置int j = l2;                                               //右半部分起始位置int n = (r1 - l1 + 1) + (r2 - l2 + 1);                    //要合并的元素个数vector<int> temp(n);                                      //辅助数组int k = 0;                                             //辅助数组其起始位置while (i <= r1&&j <= r2) {                                //挑选两部分中最小的元素放入辅助数组中if (nums[i] < nums[j])temp[k++] = nums[i++];elsetemp[k++] = nums[j++];}//如果还有剩余,直接放入到辅助数组中while (i <= r1)temp[k++] = nums[i++];while (j <= r2)temp[k++] = nums[j++];//更新原始数组元素for (int i = 0; i < n;i++){nums[l1 + i] = temp[i];}
}/*二路归并排序(递归实现)*/
void MergeSort(vector<int>& nums,int start, int end) {if (start < end) {int mid = (start + end) >> 1;              //分割序列MergeSort(nums, start, mid);              //对序列左半部分进行规并排序MergeSort(nums, mid + 1, end);              //对序列右半部分进行规并排序merge(nums, start, mid, mid + 1, end);                  //合并已经有序的两个序列}
}/*二路归并排序(迭代实现)*/
void MergeSort1(vector<int>& nums, int start, int end)
{int n = nums.size();if (start < end) {//step为组内元素个数,step/2为左子区间元素个数for (int step = 2; step/2 <n; step *= 2) {//每step个元素一组,组内前step/2和后step/2个元素进行合并for (int i = 0; i < n; i += step) {int mid = i + step / 2 - 1;                    //左子区间元素个数为step/2if(mid+1<n)                            //右子区间存在元素个数则合并//左子区间为[i,mid],右子区间为[mid+1, min(i+step-1, n-1)]merge(nums, i, mid, mid + 1, min(i + step - 1, n-1));}}}
}int main() {vector<int> nums{ 1,4,3,2,5,6,3 };MergeSort(nums,0,6);
//  MergeSort1(nums, 0, 6);for (auto x : nums)cout << x << " ";cout << endl;return 0;
}

运行结果如下
复杂度分析
(1)时间复杂度
最坏情况=最好情况=平均情况=O(nlogn)
(2)空间复杂度
需要额外大小一样的辅助数组,因此空间复杂度为O(n)。

C++排序算法之归并排序相关推荐

  1. 排序算法:归并排序、快速排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.归并排序: 1.工作原理: 归 ...

  2. 排序算法之--归并排序(好玩的一个算法o。o)快速入门

    排序算法之--归并排序(好玩的一个算法o.o) 下面是归并操作的基本思路(注意:是归并操作哦,不是归并排序哦) 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存 ...

  3. NOI提高级:排序算法之归并排序、快速排序

    图解排序算法(四)之归并排序 图解排序算法(四)之归并排序 - dreamcatcher-cx - 博客园 小学生图解排序算法:⑥归并排序 小学生图解排序算法:⑥归并排序_纯文笔记-CSDN博客_图解 ...

  4. 数据结构与算法:十大排序算法之归并排序

    数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...

  5. [Alg]排序算法之归并排序

    [Alg]排序算法之归并排序 作者:屎壳郎 miaosg01@163.com 日期:Aug 2021 版次:初版 简介: 归并排序是一类在任何情况下都能保证Nlg⁡(N)N\lg(N)Nlg(N)的排 ...

  6. 【排序算法】归并排序(C语言)

    [排序算法]-- 归并排序(C语言) 目录 一.归并排序的原理 二.两个有序数组排序和合并 1. 原地排序 2. 创建临时空间 二.递归实现 三.非递归实现 1. 实现思路 2. 数组边界问题 3. ...

  7. 排序算法中——归并排序和快速排序

    冒泡排序.插入排序.选择排序这三种算法的时间复杂度都为 $O(n^2)$,只适合小规模的数据.今天,我们来认识两种时间复杂度为 $O(nlogn)$ 的排序算法--归并排序(Merge Sort)和快 ...

  8. 【DS】排序算法之归并排序(Merge Sort)

    一.算法思想 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用,指的是将两个已经排序的序列合并成一个序列的操作.其归并思想如下: 1)申请空间,使其大小为两个已经 ...

  9. c语言归并排序代码详细注释,C语言实现排序算法之归并排序详解

    排序算法中的归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件. 一.实现原理: 1.算法基本思路 设两个有序的子文件 ...

  10. 排序算法-07归并排序(python实现)

    归并排序 概述 以归并操作为基础的排序算法,底层算法设计为分治法. 所谓分治法,就是讲问题分解为多个子问题递归求解,再将子问题答案合并. 算法实现 将待排序序列分解为两个,四个,,,n个子部分. 两两 ...

最新文章

  1. 结构感知图像修复:ICCV2019论文解析
  2. 数据千万条,备份第一条,数据找不回,老板两行泪
  3. C++太难学,怎么破?这本书给你指点迷津!
  4. 清华大学人工智能研究院开源“天授”强化学习平台
  5. linux ip地址漂移,Linux 实现高可用性(HA) —之ip 漂移方法(vrrp)
  6. 现代软件工程系列 学生读后感 梦断代码 DTSlob (2)
  7. C语言-字符串处理函数strcmp
  8. (十)java多线程之CountDownLatch
  9. 如何更改Andrioid模拟器 avd路径
  10. extjs TabPanel 监听激活事件
  11. Java-----jar反编译修改重新打包
  12. MySQL常用语句总结
  13. ios开发之商城类软件 - 框架构思
  14. 十天学会单片机和c语言编程 ppt,十天学会单片机和C语言编程笔记1
  15. flex:1什么意思
  16. DS18B20 数字温度传感器的使用和基于RT-Thread操作系统的实现
  17. loopback接口介绍
  18. 中兴程序员跳楼事件始末解读
  19. 供参考的the-gan-zoo,列出的GAN相关模型和论文
  20. 晨风机器人安卓版_晨风qq机器人

热门文章

  1. 孩子发烧,别急着降温
  2. 光猫修改配置同步到服务器,光猫—防火墙—3台服务器防火墙需要怎么配置,防火墙做二层?...
  3. 安徽大学计算机学院高亮,计算机学院关于智能计算的大规模优化学术报告圆满结束...
  4. python使用Canny算法和HoughCiecle算法实现圆的检测与定位
  5. STM32F105 实现USB BULK传输
  6. 科普 | 抖音服务器带宽有多大,为什么能够供那么多人同时刷?
  7. python+opencv摄像头人脸检测+代码注释
  8. 根据目标检测结果裁剪bbox保存到本地,python,opencv
  9. 微信按钮翻译中英对照表
  10. dnf地下城虚拟机去虚拟化过鲁大师教程