【C++】归并排序
性能分析:
时间复杂度:O(n*log(n))
空间复杂度:O(n)
归并排序算法来自于分而治之思想,“归”是“递归”的意思,“并”是"合并“的意思,就是说将复杂的数组排序问题先进性分解,然后递归的解决小问题,最后合并问题的解。

#include<iostream>
#include<vector>
using namespace std;
void sort_merge_recursive(vector<int>& data, int left, int right);
void merge(vector<int>& data, int left, int mid, int right); int main()
{
// 首先找出待排序列中最小的数,然后用这个数和原序列中的第一个数交换位置;
// 其次,找出第二小的和原第二个数交换位置;
// 依次顺序直到找到第二大的数,之后原数列完全变成有序数列.
vector<int> data = { 3,0,5,2,7,8,9,6,1 };
//获取序列元素个数
int length = 9;
int left = 0;
int right = 8;
sort_merge_recursive(data, left, right); for (int i = 0; i < length; i++)
{
cout << data[i] << " ";
}
} void sort_merge_recursive(vector<int> &data, int left, int right)
{
if (left < right)//暗含如果left>=right就不做任何操作,因为这个时候表示已经分解到只剩一个元素了,天然有序
{
//将序列一分为二获取中间位置
int mid = (left + right) / 2;
//递归处理两个子序列使之有序
sort_merge_recursive(data, left, mid);
sort_merge_recursive(data, mid + 1, right);
//合并两个有序子序列
merge(data, left, mid, right);
}
} void merge(vector<int> &data, int left, int mid, int right)
{
//将有序的两个子序列合并起来
//获取两个子序列的第一个元素
int i = left;
int j = mid + 1;
//创建临时容器来保存合并结果,同时指定容器大小
vector<int> temp;
temp.resize(right - left + 1);//从图中最底下开始往上合并,每一次因为要合并两个子序列,所以容器大小要从新设置
//开始合并
int k = 0;//临时容器的索引
while (i <= mid && j <= right)
{
if (data.at(i) <= data.at(j))//如果左边的值元素值小于右边的
{
temp.at(k++) = data.at(i++);//先把小的放到数组前面
}
else
{
temp.at(k++) = data.at(j++);
}
}
//到这里肯定已经有一个子序列的所有元素已经完全放到了容器里,接着放另一个剩下的元素
while (i <= mid)//因为不知道是哪个完全放进去了,用这种方式来判断
{
temp.at(k++) = data.at(i++);
}
while (j <= right)
{
temp.at(k++) = data.at(j++);
} //只能通过这样的方式将临时容器元素复制给原始容器得到结果
for (int n = 0; n < k; n++)
{
data.at(left++) = temp.at(n);
}
}
【C++】归并排序的更多相关文章
- 算法与数据结构(十五) 归并排序(Swift 3.0版)
上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...
- [算法]——归并排序(Merge Sort)
归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...
- 归并排序的java实现
归并排序的优点不说了. 做归并排序之前,我先试着将两个有序数组进行排序,合并成一个有序数组. 思路:定义好两个有序数组,理解的时候我先思考了数组只有一个数组的排序,然后是两个元素的数组的排序,思路就有 ...
- JavaScript算法(归并排序与快速排序)
归并排序与快速排序这两个算法放在一起,也是因为时间复杂度都是对数级别的. 目前看过的资料,归并排序看<学习JavaScript数据结构与算法>介绍的归并排序吧,快速排序直接看百度百科,讲的 ...
- 归并排序算法 java 实现
归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...
- java归并排序,单线程vs多线程
一.什么是归并排序 归并排序又称合并排序,它是成功应用分治技术的一个完美例子.对于一个需要排序的数组A[0..n-1],归并排序把它一分为二:A[0..n/2-1]和A[n/2..n-1],并对每个子 ...
- sphinx索引分析——文件格式和字典是double array trie 检索树,索引存储 – 多路归并排序,文档id压缩 – Variable Byte Coding
1 概述 这是基于开源的sphinx全文检索引擎的架构代码分析,本篇主要描述index索引服务的分析.当前分析的版本 sphinx-2.0.4 2 index 功能 3 文件表 4 索引文件结构 4. ...
- php基础排序算法 冒泡排序 选择排序 插入排序 归并排序 快速排序
<?php$arr=array(12,25,56,1,75,13,58,99,22);//冒泡排序function sortnum($arr){ $num=count($arr); ...
- [NOIP2013] 火柴排队(归并排序)
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- 用Java写算法之归并排序
转自:http://flyingcat2013.blog.51cto.com/7061638/1281026 前面的三种排序算法(冒泡排序,选择排序,插入排序)在平均情况下均为O(n^2)复杂度,在处 ...
随机推荐
- Linux命令的内部命令执行
一个命令可能既是内部命令也是外部命令 因为内部命令优先级高,先执行内部命令 [04:21:44 root@C8[ ~]#type -a echo echo is a shell builtin ech ...
- JavaWeb宿舍管理系统(附 演示、源码下载地址)
宿舍管理是高校管理的重要组成部分,一套优秀的管理系统不仅可以降低宿舍管理的难度,也能在一定程度上减少学校管理费用的支出,能是建设现代化高校管理体系的重要标志. 本篇文章将带你从运行环境搭建.系统设计. ...
- 使用 beeline 连接 hive 数据库报错处理
一.beeline连接hive报错 1. User: root is not allowed to impersonate root (state=08S01,code=0) 在初次搭建完hadoop ...
- Verification of WISHBONE I2C Master Core(IRUN+Simvision)
一.前言 很久没写技术博客了,有些懈怠,生活还得继续折腾.转眼工作一年多,时间越长越发觉得自己知之甚少,当然这跟IC行业技术密集有关.用空余时间在opencores网站上下载些小的IP看看 验证下,让 ...
- map+area标签
map标签是用于定义一个客户端的图像映射即带有可点击区域的一幅图像,配合area标签 area 元素永远嵌套在 map 元素内部.area 元素可定义图像映射中的区域 例:要实现一幅地图上鼠标点击或者 ...
- Django前后端安全验证
会话技术 关注公众号"轻松学编程"了解更多. 1.Cookie 客户端会话技术(数据存储在客户端) 以key-value的形式进行存储 cookie的操作都是通过Response来 ...
- ABP框架中一对多,多对多关系的处理以及功能界面的处理(1)
在我们开发业务的时候,一般数据库表都有相关的关系,除了单独表外,一般还包括一对多.多对多等常见的关系,在实际开发过程中,需要结合系统框架做对应的处理,本篇随笔介绍基于ABP框架对EF实体.DTO关系的 ...
- sdasd
create PROCEDURE v4(in c_year int) BEGIN declare num int(10) default 0; declare num1 int(10); select ...
- leetcode76set-matrix-zeroes
题目描述 给定一个m*n的矩阵,如果有一个元素是0,就把该元素所在的行和列上的元素全置为0,要求使用原地算法. 拓展: 你的算法有使用额外的空间吗? 一种比较直接的算法是利用O(m,n)的空间,但是这 ...
- 【Mycat】Mycat核心开发者带你看尽Mycat三大核心配置文件
写在前面 在分布式数据库中间件领域,Mycat和ShardingSphere可以说是在开源界有着相当重要的位置,不少小伙伴也在问我:Mycat和sharding-jdbc哪个好呀!其实,就我本身而言, ...