数据结构 - 归并排序(merging sort) 详解 及 代码

归并排序(merging sort) 详解 及 代码

本文地址: http://blog.csdn.net/caroline_wendy

归并排序(merging sort): 包含2-路归并排序, 把数组拆分成两段, 使用递归, 将两个有序表合成一个新的有序表.

归并排序(merge sort)的时间复杂度是O(nlogn), 实际效果不如快速排序(quick sort)和堆排序(heap sort),

但是归并排序是稳定排序, 而快速排序和堆排序则不是.

代码:

/*
 * main.cpp
 *
 *  Created on: 2014.6.12
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;

/*参数: SR-输入数组, TR-输出数组, i至m:第一段有序, m+1至n:第二段有序*/
void Merge (const std::vector<int> SR, std::vector<int>& TR, int i, int m, int n)
{
	int j , k;
	for (j=m+1, k=i; i<=m && j<=n; ++k) {
		if (SR[i] < SR[j])
			TR[k] = SR[i++];
		else
			TR[k] = SR[j++];
	}
	if (i<=m)
		std::copy((SR.begin()+i), (SR.begin()+m+1), TR.begin()+k);
	if (j<=n)
		std::copy((SR.begin()+j), (SR.begin()+n+1), TR.begin()+k);
}

/*参数: SR-输入数组, TR-输出数组, s:起始, t:末尾*/
void MSort (const std::vector<int> SR, std::vector<int>& TR, int s, int t)
{
	std::vector<int> tempTR(SR.size());
	if (s == t)
		TR[s] = SR[s];
	else {
		int m = (s+t)/2; //平分SR, SR[s..m]和SR[m+1..t]
		MSort(SR, tempTR, s, m); //前半段
		MSort(SR, tempTR, m+1, t); //后半段
		Merge(tempTR, TR, s, m, t); //排序
		//copy(TR.begin(), TR.end(), ostream_iterator<int>(cout, " "));
		//std::cout << std::endl;
	}
}

void MergeSort (std::vector<int>& L) {
	MSort(L, L, 0, L.size()-1);
}

int main (void)
{
	std::vector<int> L = {49, 38, 65, 97, 76, 13, 27, 49};
	MergeSort(L);
	copy(L.begin(), L.end(), ostream_iterator<int>(cout, " "));
	std::cout << std::endl;
	return 0;
}

输出:

13 27 38 49 49 65 76 97

数据结构 - 归并排序(merging sort) 详解 及 代码,布布扣,bubuko.com

时间: 2024-10-22 05:45:43

数据结构 - 归并排序(merging sort) 详解 及 代码的相关文章

数据结构 - 堆排序(heap sort) 详解 及 代码(C++)

堆排序(heap sort) 详解 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 堆排序包含两个步骤: 第一步: 是建立大顶堆(从大到小排序)或小顶堆(从小到大排序), 从下往上建立; 如建堆时, s是从大到小; 第二步: 是依次交换堆顶和堆底, 并把交换后的堆底输出, 只排列剩余的堆, 从上往下建立; 如构造时, s始终是1; 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: S

数据结构 - 简单选择排序(simple selection sort) 详解 及 代码(C++)

数据结构 - 简单选择排序(simple selection sort) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28601965 选择排序(selection sort) : 每一趟在n-i+1个记录中选取关键字最小的记录作为有序序列中第i个记录. 简单选择排序(simple selection sort) : 通过n-i次关键字之间的比较, 从n-i+1个记录中选出关键字最小的记录, 并和第i个记录交换. 选择排序需

数据结构 - 归并排序(merging sort)

归并排序(merging sort): 包含2-路归并排序, 把数组拆分成两段, 使用递归, 将两个有序表合成一个新的有序表. 归并排序(merge sort)的时间复杂度是O(nlogn), 实际效果不如快速排序(quick sort)和堆排序(heap sort), 但是归并排序是稳定排序, 而快速排序和堆排序则不是. 代码: /* * main.cpp * *  Created on: 2014.6.12 *      Author: Spike */ /*eclipse cdt, gcc

数据结构 - 树形选择排序 (tree selection sort) 详解 及 代码

http://blog.csdn.net/yj_1989/article/details/46598579http://blog.csdn.net/yj_1989/article/details/46598581http://blog.csdn.net/yj_1989/article/details/46598605http://blog.csdn.net/yj_1989/article/details/46598607http://blog.csdn.net/yj_1989/article/d

【数据结构】循环链表&amp;&amp;双向链表详解和代码实例

喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 循环链表 1.1 什么是循环链表? 前面介绍了单链表,相信大家还记得相关的概念.其实循环链表跟单链表也没有差别很多,只是在某些细节上的处理方式会稍稍不同. 在此之前,大家可以先思考一个问题:单链表中,要找到其中某个节点只需要从头节点开始遍历链表即可,但是有些时候我们的想法是,能不能从任意节点开始遍历,也能找到我们需要的那个节点呢? 其实啊,这个实现也很简单自然,把整个链表串成一个环问题就迎刃而解了.所以,关于循环链表,

nginx学习三 nginx配置项解析详解及代码实现

nginx配置项解析详解及代码实现 0回顾 在上一节,用nginx简单实现了一个hello world程序:当我们在浏览器中输入lochost/hello ,浏览器就返回:hello world.为什么会这样呢,简单一点说就是当我们请求访问hello这个服务,nginx就会看配置文件中是否有,如果有,根据具体的handler处理后把处理的结果返回给用户,没有就返回not found. location /hello { test_hello ;//无参数的配置 这其实是一个简单的配置.这节我们来

ios中创建可以拖动的view原理和实现详解(含代码)

有时候我们会需要在界面上拖动view;uiview是继承于uiresponder的,所以可以响应触摸相关的事件. 重点是以下一组方法: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event - (void)touchesEnded:(NSSet *)touches withEvent:(UIE

《ACM/ICPC 算法训练教程》读书笔记 之 数据结构(线段树详解)

依然延续第一篇读书笔记,这一篇是基于<ACM/ICPC 算法训练教程>上关于线段树的讲解的总结和修改(这本书在线段树这里Error非常多),但是总体来说这本书关于具体算法的讲解和案例都是不错的. 线段树简介 这是一种二叉搜索树,类似于区间树,是一种描述线段的树形数据结构,也是ACMer必学的一种数据结构,主要用于查询对一段数据的处理和存储查询,对时间度的优化也是较为明显的,优化后的时间复杂为O(logN).此外,线段树还可以拓展为点树,ZWK线段树等等,与此类似的还有树状数组等等. 例如:要将

设计模式 - 模板方法模式(template method pattern) 排序(sort) 详解

模板方法模式(template method pattern) 排序(sort) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式的一个主要的应用是排序(sort)算法. 对象的排列方式并不是完全相同, 所以需要排序(sort)算法compareTo()