博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图解排序算法之归并排序
阅读量:3948 次
发布时间:2019-05-24

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

基本思想

  归并排序(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

执行结果

[1, 2, 3, 4, 5, 6, 7, 8, 9]

最后

  归并排序是稳定排序,它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。java中Arrays.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。从上文的图中可看出,每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。

 

作者: 

出处: 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在页面明显位置给出原文链接。

你可能感兴趣的文章
linux 学习之awk命令
查看>>
linux学习之查找文件find,locate,whereis使用
查看>>
JS中$含义及用法
查看>>
web学习之ajax记录
查看>>
web学习之ajax参数解析
查看>>
linux学习之curl命令使用
查看>>
java模板引擎中主要三个JSP,Freemarker,Velocity简述
查看>>
javascript学习之$(function() {})
查看>>
kafka初识
查看>>
mysql存储过程 --游标的使用 取每行记录
查看>>
ranger通过web界面登录用户验证类UsernamePasswordAuthenticationFilter
查看>>
墨菲定律——生活
查看>>
墨菲定律——职场
查看>>
mysql学习使用二(更新)
查看>>
java匿名内部类原理及使用
查看>>
java基础学习之Timer定时器使用
查看>>
Linux中修改环境变量及快速生效方法
查看>>
Linux学习 - vi/vim 编辑器显示行号
查看>>
linux 卸载python
查看>>
Linux下安装Python2.7与升级至2.7
查看>>