图解排序算法-归并排序
基本思想
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
分而治之
可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。
合并相邻有序子序列
再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。
代码实现
package sortdemo;import java.util.Arrays;/*** Created by chengxiao on 2016/12/8.*/
public class MergeSort {public static void main(String []args){int []arr = {9,8,7,6,5,4,3,2,1};sort(arr);System.out.println(Arrays.toString(arr));}public static void sort(int []arr){int []temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间sort(arr,0,arr.length-1,temp);}private static void sort(int[] arr,int left,int right,int []temp){if(left<right){int mid = (left+right)/2;sort(arr,left,mid,temp);//左边归并排序,使得左子序列有序sort(arr,mid+1,right,temp);//右边归并排序,使得右子序列有序merge(arr,left,mid,right,temp);//将两个有序子数组合并操作}}private static void merge(int[] arr,int left,int mid,int right,int[] temp){int i = left;//左序列指针int j = mid+1;//右序列指针int t = 0;//临时数组指针while (i<=mid && j<=right){if(arr[i]<=arr[j]){temp[t++] = arr[i++];}else {temp[t++] = arr[j++];}}while(i<=mid){//将左边剩余元素填充进temp中temp[t++] = arr[i++];}while(j<=right){//将右序列剩余元素填充进temp中temp[t++] = arr[j++];}t = 0;//将temp中的元素全部拷贝到原数组中while(left <= right){arr[left++] = temp[t++];}}
}
执行结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
最后
归并排序是稳定排序,它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。java中Arrays.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。从上文的图中可看出,每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。
转载地址:https://www.cnblogs.com/chengxiao/p/6194356.html
图解排序算法-归并排序相关推荐
- 图解排序算法(四)之归并排序
图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide) ...
- 经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 ...
- python排序算法——归并排序(附代码)
python排序算法 --归并排序 文章目录 python排序算法 --归并排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序 ...
- 3.图解排序算法(三)之堆排序
作者: dreamcatcher-cx 出处: http://www.cnblogs.com/chengxiao/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在页面明显位 ...
- 十大经典排序算法-归并排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 八大排序算法 —— 归并排序
归并排序 归并算法的理解比较难,是一种区别于插入算法,选择算法和交换算法的一种独特算法,需要逐步理解. 核心思想:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治( ...
- 排序算法 —— 归并排序
归并排序算法 1.划分问题:把序列分成元素个数尽量相等的两半. 2.递归求解:把两半元素分别排序. 3.合并问题:把两个有序表合并成一个. 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用 ...
- 二分归并排序算法_第五篇排序算法|归并排序
0x01,前言闲叙 最近几年很少看电视了,因为没时间看了,除了偶尔刷刷头条,基本上不会花大块的时间沉迷于电视剧,综艺,这或许就是短视频时代所带来的一些改变吧,我们都会深受其中. 0x02,先看下这篇文 ...
- 【算法】排序算法——归并排序
[fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 归并排序是分治法在排序问题上的运用,因此为了更好地了解归并排序,首先了解 ...
最新文章
- 如何对DevOps数据库进行源代码控制
- UITextField常用属性
- 华为p4用鸿蒙系统吗_华为mate40是鸿蒙系统吗
- xbox虚拟服务器,Xbox One平台真相:原生Win8/虚拟化运行
- JavaScript 中 substr 和 substring的区别
- 查漏补缺!java主要包括哪几种开发平台
- C#自定义规则对比两个集合的对象是否相等
- [leetcode]_Climbing Stairs
- 缩放浏览器不会换行_深入解析 EventLoop 和浏览器渲染、帧动画、空闲回调的关系...
- 嵌入式系统中的FLASH
- 微型计算机原理与接口技术第二版答案邹逢兴,清华大学出版社-图书详情-《微型计算机原理与接口技术教学辅导(第2版)》...
- 科隆OPTIFLUX2100W/4100C分体式电磁流量计维修
- 若依的框架怎么样_若依后台管理框架初识
- 浪潮服务器开启虚拟化功能,浪潮服务器-虚拟化解决方案.ppt
- 怎样看股市K线图指标之成本均线指标CYC
- WKWebView加载txt文档乱码
- java cron表达式 每天凌晨两点_Quartz cron表达式(时间表达式)
- python抢红包脚本_Python自动抢视频红包,仅供学习!
- Android图表控件MPAndroidChart——BarChart实现多列柱状图以及堆积柱状图
- 你为什么总是做出错误的选择?
热门文章
- python 开课了_解答你学习Python的困惑,《Python小白成长记》开课啦
- 九、Python文件
- 编译安装库等问题汇总
- 犬夜叉觉醒怎么在电脑上玩 犬夜叉觉醒电脑版玩法教程
- 小程序 wx.showToast 一闪而过的解决办法
- openSUSE 15.0 显卡驱动安装
- kivy实现屏幕切换
- 权力的游戏手游如何用电脑玩 权力的游戏凛冬将至PC电脑版教程
- python十进制小数转二进制_Python实现的十进制小数与二进制小数相互转换功能
- 论文笔记(三)《Enhancing the Transferability of Adversarial Attacks through Variance Tuning》