将一个大序列的排序问题分解为对两个或多个子序列的排序问题,然后对子序列递归使用同样的方式进行排序;在子序列排好序后,将结果合并起来即可。利用这种思想的排序方法就是著名的归并排序。之所以称为归并排序,是因为整个算法的成本由归并部分决定。
归并算法描述如下:
1)如果n=1,排序完成;
2)将序列分解为两个子序列A[1
… ceiling(n/2)]和A[ceiling(n/2)+1
… n];
3)递归对子序列A[1
… ceiling(n/2)]和A[ceiling(n/2)+1
… n]进行排序;
4)将排好序的两个子序列进行归并。
归并排序使用的是分治策略,而分治策略的关键是分解和合并。归并排序的分解很简单:直接将序列从中间斩断;但合并的时候需要将两个排好序的子序列按次序进行合适的穿插,从而获得原序列的一个排序。
合并时我们使用两个指针:一个指向A序列里下一个要归并的元素,一个指向B序列里下一个要归并的元素。每步我们对这两个指针所指的元素进行比较,小者被归并到C序列里,并将指向较小者的指针往后推进一个元素,另一个指针保持不动。这样循环往复直到一个子序列为空。这时,另一个子序列中剩下的所有元素直接复制到C序列末尾即可。
注意:归并排序在最坏、平均和最好情况下时间复杂度都是Θ(nlogn)。这是归并排序一个显著的特点:一视同仁。
/*
函数名:
MergeSort
功能:
归并排序
模板参数说明:T必须支持小于操作
参数说明:
data待排序数组, size待排序数组大小
前置条件:
data!=NULL, size>0
后置条件:
data按非降序排列
用法:
#include <algorithm>
int arr[]={10,9,8,4,5,7,6,3,1,4};
MergeSort(arr, 10);
*/
template <typename
T>
void MergeSort (T data[],
int size)
{
if ( size>1 )
{
//预处理
int mid=size/2;
int numOfleft=mid;
int numOfright=size-mid;
T* left=new T[numOfleft];
T* right=new T[numOfright];
//分解
std::copy(data, data+numOfleft, left);
std::copy(data+numOfleft, data+size, right);
MergeSort(left, numOfleft);
MergeSort(right, numOfright);
//合并
std::merge(left, left+numOfleft, right, right+numOfright, data);
//清理
delete[] left;
delete[] right;
}
}
/*
函数名:
MergeSort
功能:
归并排序
模板参数说明:T元素类型,
Func函数对象或指针
参数说明:
data待排序数组, size待排序数组大小,f函数对象或指针
前置条件:
data!=NULL, size>0
后置条件:
data按f排列
用法:
#include <algorithm>
bool cmp(int a, int b)
{ return a<b; }
int arr[]={10,9,8,4,5,7,6,3,1,4};
MergeSort(arr, 10,cmp);
*/
template <typename
T, typename Func>
void MergeSort (T data[],
int size, Func f)
{
if ( size>1 )
{
int mid=size/2;
int numOfleft=mid;
int numOfright=size-mid;
T* left=new T[numOfleft];
T* right=new T[numOfright];
std::copy(data, data+numOfleft, left);
std::copy(data+numOfleft, data+size, right);
MergeSort(left, numOfleft, f);
MergeSort(right, numOfright, f);
std::merge(left, left+numOfleft, right, right+numOfright, data, f);
delete[] left;
delete[] right;
}
}
分享到:
相关推荐
最快的排序算法 谁才是最强的排序算法:快速排序-归并排序-堆排序,排序算法数据结构
算法的实现----归并排序 数据结构中学过的 编起耍哈哈
VC++多线程实现三种排序算法比较----冒泡排序、快速排序、归并排序,很有意思,可以下载看看!
C语言算法之归并排序C语言算法之归并排序C语言算法之归并排序C语言算法之归并排序
算法-数据结构和算法-14-归并排序.rar
算法设计,给出归并排序的C++实现代码,并利用给随机数方式求运行时间
算法-理论基础- 排序- 归并排序(包含源程序).rar
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
归并排序,排序等算法,数据结构,快速排序,链表排序归并排序,排序等算法,数据结构,快速排序,链表排序
算法设计实验报告,包括:快速排序和归并排序两种算法各自的基本思想、时间复杂度分析,C++实现代码,两种算法运行时间的比较,运行截图,实验心得。
详解Java常用排序算法-归并排序
这是个算法设计,比较简单,但是可以实现.采用分治策略进行归并排序.
python 归并排序算法 归并排序是一种基于分治思想的排序算法,它将待排序的序列分成若干个子序列,每个子序列都是有序的,然后再将这些有序的子序列合并成一个有序的序列。归并排序的时间复杂度为O(nlogn),是一种...
排序算法-归并排序详细讲解(MergeSort)
根据算法导论实现的归并排序算法
经典排序算法 - 归并排序Merge sort 经典排序算法 - 冒泡排序Bubble sort 经典排序算法 - 选择排序Selection sort 经典排序算法 - 鸡尾酒排序Cocktail sort 经典排序算法 - 希尔排序Shell sort 经典排序算法 - ...
排序算法:排序算法汇总--各类排序算法 冒泡,选择,插入,快排,归并,堆排
基于python的排序算法-归并排序Merge Sort
自己编写的基于java的快速排序和归并算法
C语言二路归并排序算法, 写了个二路归并的归并排序小代码,直接贴上来