MergeSort和QuickSort是两种比较类似的sort方式,他们都是通过Divide and Conquer来实现的。都需要使用recursion的方式进行排序。

他们的相同之处在于原理上一致。首先要做的是split,将N个element分成两部分进行排序,每一部分也会再继续分成两部分排序,直到只有2个element的时候就可以很容易的比较排序。这个就是recursion的使用方法。属于Divide and Conquer中的Divide部分。当N个element被分解为很多个小部分进行排序后,要做的就是把他们再合并起来组成排好顺序的list. 这个就是merge,或者说是Conquer。这两种Sort都需要merge这一步骤,但是细节不同。下面就来分析一下两种sort的区别之处。

MergeSort的split比较简单,将所有element以binary的方式分开,就是说分开后左边与右边element的个数是相等的,或者相差为1(比如总共有5个element的时候,分成左边3个右边2个)。divide过程的复杂度只需计算为1就可以了。而MergeSort的Conquer(Merge)部分则相对复杂。当所有element被分为很多个小部分进行排序后,每个小部分里面的element都是排好顺序的,然后需要和另一个小部分里的element排序。因为在split的时候是以binary方式分开的,左边和右边的element没有任何大小关系,所以在合并的过程中需要将左边部分的element与右边部分的element逐一比较然后存储在一个新的list里面。这样,合并过程的复杂度为N。MergeSort的复杂度为N+2T(N/2). (这里的第一个N是指merge的复杂度)。经过进一步计算得到的复杂度为NlgN.

QuickSort的split比较复杂,而且有多种方法,方法一:使用第一个element做为pivot,然后把小于这个pivot的所有element放在左边,大与他的放在右边,这样得到的两个部分左边任意element都比右边任意element小。方法二:使用中间值的方法作为pivot,(IndexOfBegin+IndexOfEnd)/2。我们选择pivot的标准是尽量选择不大不小接近中间的element,这样根据这个pivot所分开的两部分的数量不会相差太大。如果使用方法一,而list中的element刚好又是sorted的,那divide分开的两部分数量悬殊,算法复杂度非常高,为N*N。一般情况,QuickSort的split的复杂度为N. 假设QuickSort的split方法分开后的所有小部分为a,b,c... 那么a中的所有element都比b中的小,b中的所有element比c中的小。这样在合并的时候非常简单,只要把a,b,c...里的element排好顺序,然后把b直接放在a后面就好了。这里的复杂度只有1。所以整个QuickSort的复杂度为N+2T(N/2)这里的第一个N指split的复杂度。经过计算得到的复杂度为NlgN.

总体来说,MergeSort的split方便merge复杂,QuickSort的split复杂merge简单。了解原理后就可以根据不同情况选择不同的排序方法。

MergeSort和QuickSort的比较相关推荐

  1. Leetcode | Sort List

    Sort a linked list in O(n log n) time using constant space complexity. merge sort.heap sort和quick so ...

  2. 编程面试过程中最常见的10大算法

    编程面试过程中最常见的10大算法 编程语言:C/C++ 1. 字符串 如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法. toCharArray() // 获得字符串对应的char数组 A ...

  3. 编程面试的10大算法概念汇总

    编程面试的10大算法概念汇总 嘿,第一次翻译文章,在ProgramCreek看到的,原文章名为Top 10 Algorithms for Coding Interview, 对于我这个明年即将直奔BA ...

  4. 十种排序算法的java汇总

    作为一个数学系的coding菜鸟,还是得多多练习coding,花了一个多小时又手撸了一遍排序,这次把代码补全关了,果然有点不习惯- 排序算法算是基础中的基础,必须得多练.稍微讲一下要点吧. 冒泡排序: ...

  5. 不稳定学习器适合做基分类器_分类稳定性

    不稳定学习器适合做基分类器 什么是分类? (What is sorting?) It means to arrange data elements in increasing or decreasin ...

  6. 写给中学生的算法入门:学代码之前看这篇就够了

    导读:本文内容主要源自德语大学中发起的科普活动,初衷是让高中生领会算法和计算机科学的奇妙与魅力.阅读本文不需要任何关于算法和计算的预备知识.我们希望不仅学生,而且包括希望了解迷人的算法世界的成年人都能 ...

  7. java面试算法总结_java编程面试过程中常见的10大算法概念汇总

    以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java的角度看问题,包含下面的这些概念: ...

  8. 基本数据结构之Sort

    2019独角兽企业重金招聘Python工程师标准>>> 问题描述: BubbleSort InsertionSort ShellSort MergeSort HeapSort Qui ...

  9. Java 超全面试题

    数据库&事务 1.什么样的场景会产生数据库死锁,如何解决? 2.SQL如何优化 3.Oracle和mysql分页的实现原理 4.唯一索引能否插入空 5.数据库索引的算法原理 6.乐观锁,悲观锁 ...

最新文章

  1. vlist java实现-转
  2. Make!Sense 动手好伴侣,带你轻松做实验
  3. 框架:初识Mybatis
  4. Android 开发问题记录
  5. ps -ef 输出结果的具体含义
  6. HDU 2095 find your present (2)
  7. SWISHMAX2脚本整理及Swishmax使用技巧
  8. POJ2586(贪心)
  9. opencv运行出现错误
  10. java抽象类及其派生类_java抽象类
  11. 林权抵押贷款政策出台 将实现林业资源变资本
  12. 算法:动态规划解决爬楼梯Climbing Stairs python3
  13. 获取spring 框架源码方式
  14. 畅购商城项目,面试问答,项目详解及全部代码
  15. LM2596降压DCDC芯片
  16. 诊断Oracle数据库Hanging问题
  17. fms安装教程 linux_如何借助Pandora FMS监控CentOS和Ubuntu服务器?
  18. MySQL 权限操作
  19. 三分钟看完北京城市(含京津冀)【总体规划2016-2050】
  20. jenkins+Xcode+蒲公英实现ipa自动打包发布全攻略

热门文章

  1. Javascript中的恒等运算符与等于运算符的区别
  2. JavaScript提示层漂浮js特效代码
  3. 02. Java环境搭建
  4. Websphere8.5.5最新补丁包 :WebSphere Application Server V8.5.5 Fix Pack 15(8.5.5.15)
  5. 暗影精灵3+ ubuntu18.04 安装显卡驱动
  6. 180512 tensorboard高维数据可视化
  7. Canvas--画一个圆
  8. 出现Could not initialize class net.sf.json.JsonConfig错误。解决方法如下:
  9. ASP.NET Web API与Owin OAuth:使用Access Toke调用受保护的API(二)
  10. itextpdf text转pdf