排序算法总结(二)归并排序【Merge Sort】
一.归并排序原理(Wikipedia)
归并排序本质是分治思想的应用,并且各层分治递归可以同时进行
1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
2.设定两个指针,最初位置分别为两个已经排序序列的起始位置
3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
4.重复步骤3直到某一指针到达序列尾
5.将另一序列剩下的所有元素直接复制到合并序列尾
二.过程
原始数据

seg = 1时


我的算法参考的是wikipedia上的算法,与VisuAlgo上所示的稍有区别,VisuAlgo上是先2个数字合并,然后合并成4个有序数列,然后在对后面的2个合并,在合并成4个有序数列,把这两组有序数列合并成一个长度为8的有序数列。




wikipedia上,是先将所有的单个数字合并成有序的长度为2的有序数组,然后在将所长度为2的分别合并成长度为4的有序数组,循环知道合成长度为Len的有序数组。个人认为wikipedia上的方法更加容易表达,因为不用回退可以一次性处理完所有相同长度的数据。
wikipedia上代码的排序过程如图所示:

3.代码(参考了wikipedia上的代码,只需要第一次分配一次空间)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; template <typename T>
void MergeSort( vector<T> & nums ) {
int seg = ;
int len = nums.size();
vector<T> CopyNums(nums);
for(int seg = ; seg < len; seg += seg ){
for(int start = ; start < len; start += seg + seg ){
int low = start;
int mid = min( start + seg, len );//对于最后一次归并
int high = min( start + seg + seg, len );//最后一次归并长度会大于len
int k = low;
int start1 = low;
int end1 = mid;
int start2 = mid;
int end2 = high;
while( start1 < end1 && start2 < end2 ){
CopyNums[k++] = nums[start1]<nums[start2]? nums[start1++]:nums[start2++];
}
while( start1 < end1 ){
CopyNums[k++] = nums[start1++];//如果start1后还有元素没有归并,则将start1后的元素进行归并
}
while( start2 < end2 ){
CopyNums[k++] = nums[start2++];////如果start2后还有元素没有归并,则将start2后的元素进行归并
}
}
nums.swap(CopyNums);//在C++ STL中,耗时是常量,因为实际并没有交换他们的值,而只是交换了指针。
//(i.e., the containers exchange references to their data, without actually performing any element copy or movement) }
} int main(){
vector<int> nums{,,,,,,,,,,,,,,};
cout<<" Before Sort:" ;
for( auto m: nums){
cout << m <<" ";
}
cout<<endl;
MergeSort( nums );
cout<< " After Sort:";
for( auto m: nums){
cout << m <<" ";
}
cout<<endl;
}
4.总结
1.空间复杂度,因为只有开始分配了一次与原始数据相同长度的空间,所以空间复杂度为O(n);
2.时间复杂度,总的比较次数在(nlogn)/2和nlogn-n+1之间;
3.归并排序是稳定的排序算法。
排序算法总结(二)归并排序【Merge Sort】的更多相关文章
- 排序算法二:归并排序(Merge sort)
		
归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 private void merge_sort(int[] array, int ...
 - 经典排序算法 - 归并排序Merge sort
		
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...
 - 连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort)
		
连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort) 1,起泡排序(bubble sort),大致有三种算法 基本版,全扫描. 提前终止版,如果发现前区里没有发生交换 ...
 - Java排序算法(二)
		
java排序算法(二) 二.改进排序算法 2.1希尔排序 定义:希尔排序(ShellSort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. ...
 - java讲讲几种常见的排序算法(二)
		
java讲讲几种常见的排序算法(二) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 堆排序 思路:构建一个小顶堆,小顶堆就是棵二叉树,他的左右孩子均大于他的根节点( ...
 - [Swift]八大排序算法(二):快速排序
		
排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...
 - java排序算法(二):直接选择排序
		
java排序算法(二) 直接选择排序 直接选择排序排序的基本操作就是每一趟从待排序的数据元素中选出最小的(或最大的)一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完,它需要经过n- ...
 - 【DS】排序算法之冒泡排序(Bubble Sort)
		
一.算法思想 冒泡排序是排序算法中比较有意思的一种排序方法,也很简单.其算法思想如下: 1)比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2)对每一对相邻元素作同样的工作,从开始第一对到结尾 ...
 - 小小c#算法题 - 8 - 归并排序 (Merging Sort)
		
“归并”的含义是将两个或两个以上的有序序列组合成一个新的有序序列.这个“归并”可以在O(n+m)的数量级上实现,但这同时也需要O(n+m)的空间复杂度.具体为:首先分配一个新的长度为n+m的空序列,然 ...
 - 【排序算法】冒泡排序(Bubble Sort)
		
一.简介 冒泡排序(Bubble Sort)也是一种简单直观的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换, ...
 
随机推荐
- Twitter CEO:有望进军中国 不会改变原则
			
新浪科技讯 8月12日下午消息,据台湾“中央社”报道,Twitter CEO科斯特洛(Dick Costolo)日前接受<日经新闻>专访时指出,Twitter有望进军中国大陆,科斯特洛表示 ...
 - SimpleDateFormat()简单了解
			
比如:SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM天dd日 HH时mm分ss秒 一年中的第 D 天 一年中第w个星期 一月中第 ...
 - ios页面间传递参数四种方式
			
ios页面间传递参数四种方式 1.使用SharedApplication,定义一个变量来传递. 2.使用文件,或者NSUserdefault来传递 3.通过一个单例的class来传递 4.通过Dele ...
 - Ubuntu 14.10 下进程实时IO监控iotop命令详解
			
介绍 Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦. iotop 是一个用来监视磁盘 I/O 使用状况 ...
 - Chapter 1: A Simple Web Server
			
这算是一篇读书笔记,留着以后复习看看. Web Server又称为Http Server,因为它使用HTTP协议和客户端(一般是各种各样的浏览器)进行通信. 什么是HTTP协议呢? HTTP协议是基于 ...
 - nosql(1)---radis
			
Radis是一个key-value数据库,它会将key放入内存中,value放在硬盘上. 可以将数据持久化存储到磁盘. 内置的主从复制: master server和slave server之间有内 ...
 - php生成图片
			
//生成图片,第一个参数宽,第二个高 1.$image = imagecreatetruecolor(100,25); //生成颜色,当第一次调用生成颜色的方法,是生成背景颜色 2.$backgrou ...
 - php大力力 [016节] 兄弟连高洛峰php教程(2014年 14章数据库章节列表)
			
2015-08-25 php大力力016 兄弟连高洛峰php教程(2014年 14章数据库章节列表) [2014]兄弟连高洛峰 PHP教程14.1.1 复习数据库 15:58 [2014]兄弟连高洛 ...
 - HTML中使用CSS的方法
			
行内样式表 <html> <head> <title>行内样式表</title> </head> <body> <p st ...
 - Corporative Network_并查集
			
Description A very big corporation is developing its corporative network. In the beginning each of t ...