博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
归并排序法
阅读量:5024 次
发布时间:2019-06-12

本文共 1400 字,大约阅读时间需要 4 分钟。

归并排序法,这里介绍二路归并排序法,其他原理类似,只是更加复杂。

归并排序(Merge Sort)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。

归并排序的具体做法:

  1. 把原序列不断地递归等分,直至每等份只有一个元素,此时每等份都是有序的。
  2. 相邻等份合并,不断合并,直至合并完全。

二路归并

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序最常用的是二路归并,即把两个小的有序的序列和并成一个大的有序序列:合二为一。

一个二路归并的流程图是这样的:

多路归并无非是多个有序的小序列合并成一个大的有序序列,道理和二路归并一样。

 

把两个有序序列合成一个大的有序序列的实现代码如下:

void MergeSort(int* a,int* b,int na,int nb,int* c){    if(a == NULL || na <= 0 || b == NULL || nb <= 0)        return;    int i=0,j=0,k=0;    //将a和b数组中的元素有序的放入到c数组中    while(i

 

可以看出,二路归并的时间复杂度是O(n),n是原序列的数据规模。以上代码是归并排序的基础,弄懂了它,就很好写归并排序了,看下归并排序的流程图:

可以看出,上半部分不断地递归深入:不断地均分原序列,直到每一部分只含有一个元素。下半部分,开始递归返回,通过反复调用二路归并算法,把相邻的有序子序列合并成一个规模更大的序列。

归并排序的代码如下:

//把[first,mid]与[mid+1,last]范围内的数据合并void mergeArray(int* a,int* b,int first,int mid,int last){    int i = first;    int j = mid + 1;    int k = 0;    while(i<=mid && j<=last)    {        //将[first,mid]与[mid+1,last]内的数据排序合并        while(i<=mid && a[i]<=a[j])            b[k++] = a[i++];        while(j<=last && a[j]
>1; //求区间中点 //不断的划分区间,然后进行递归操作 mergesort(a,b,first,mid); mergesort(a,b,mid+1,last); mergeArray(a,b,first,mid,last); }}//传入需要归并排序的数组void MergeSort(int* a,int n) { if(a == NULL && n <= 1) return; int b[n]; mergesort(a,b,0,n-1); delete[] b;}

 

归并排序参考:

 

转载于:https://www.cnblogs.com/jeavenwong/p/8214752.html

你可能感兴趣的文章
一款基于css3的3D图片翻页切换特效
查看>>
Feign使用Hystrix无效原因及解决方法
查看>>
Sizeof与Strlen的区别与联系
查看>>
hadoop2.2.0_hbase0.96_zookeeper3.4.5全分布式安装文档下载
查看>>
Flutter 贝塞尔曲线切割
查看>>
golang 的编译安装以及supervisord部署
查看>>
easyui源码翻译1.32--Dialog(对话框窗口)
查看>>
阿里架构师,讲述基于微服务的软件架构模式
查看>>
Eclipse导入maven项目时,Pom.xml文件报错处理方法
查看>>
01、JAVA开发准备
查看>>
asp.net mvc 错误处理 - 自定义报错处理,生成错误日志
查看>>
Linux centos ssh
查看>>
R语言之避免for循环示例
查看>>
[转]jQuery 选择器和dom操作
查看>>
Jenkins+Maven+SVN快速搭建持续集成环境(转)
查看>>
bootstrap 媒体查询
查看>>
杜教筛
查看>>
《Ext JS模板与组件基本知识框架图----模板》
查看>>
txmpp
查看>>
微信开发时调用jssdk,在安卓设备中成功调用;在ios设备中返回错误消息:config fail,无其他具体错误消息,且接口权限显示获取ok,无法调用...
查看>>