MergeSort和QuickSort的比较
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的比较相关推荐
- Leetcode | Sort List
Sort a linked list in O(n log n) time using constant space complexity. merge sort.heap sort和quick so ...
- 编程面试过程中最常见的10大算法
编程面试过程中最常见的10大算法 编程语言:C/C++ 1. 字符串 如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法. toCharArray() // 获得字符串对应的char数组 A ...
- 编程面试的10大算法概念汇总
编程面试的10大算法概念汇总 嘿,第一次翻译文章,在ProgramCreek看到的,原文章名为Top 10 Algorithms for Coding Interview, 对于我这个明年即将直奔BA ...
- 十种排序算法的java汇总
作为一个数学系的coding菜鸟,还是得多多练习coding,花了一个多小时又手撸了一遍排序,这次把代码补全关了,果然有点不习惯- 排序算法算是基础中的基础,必须得多练.稍微讲一下要点吧. 冒泡排序: ...
- 不稳定学习器适合做基分类器_分类稳定性
不稳定学习器适合做基分类器 什么是分类? (What is sorting?) It means to arrange data elements in increasing or decreasin ...
- 写给中学生的算法入门:学代码之前看这篇就够了
导读:本文内容主要源自德语大学中发起的科普活动,初衷是让高中生领会算法和计算机科学的奇妙与魅力.阅读本文不需要任何关于算法和计算的预备知识.我们希望不仅学生,而且包括希望了解迷人的算法世界的成年人都能 ...
- java面试算法总结_java编程面试过程中常见的10大算法概念汇总
以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java的角度看问题,包含下面的这些概念: ...
- 基本数据结构之Sort
2019独角兽企业重金招聘Python工程师标准>>> 问题描述: BubbleSort InsertionSort ShellSort MergeSort HeapSort Qui ...
- Java 超全面试题
数据库&事务 1.什么样的场景会产生数据库死锁,如何解决? 2.SQL如何优化 3.Oracle和mysql分页的实现原理 4.唯一索引能否插入空 5.数据库索引的算法原理 6.乐观锁,悲观锁 ...
最新文章
- vlist java实现-转
- Make!Sense 动手好伴侣,带你轻松做实验
- 框架:初识Mybatis
- Android 开发问题记录
- ps -ef 输出结果的具体含义
- HDU 2095 find your present (2)
- SWISHMAX2脚本整理及Swishmax使用技巧
- POJ2586(贪心)
- opencv运行出现错误
- java抽象类及其派生类_java抽象类
- 林权抵押贷款政策出台 将实现林业资源变资本
- 算法:动态规划解决爬楼梯Climbing Stairs python3
- 获取spring 框架源码方式
- 畅购商城项目,面试问答,项目详解及全部代码
- LM2596降压DCDC芯片
- 诊断Oracle数据库Hanging问题
- fms安装教程 linux_如何借助Pandora FMS监控CentOS和Ubuntu服务器?
- MySQL 权限操作
- 三分钟看完北京城市(含京津冀)【总体规划2016-2050】
- jenkins+Xcode+蒲公英实现ipa自动打包发布全攻略
热门文章
- Javascript中的恒等运算符与等于运算符的区别
- JavaScript提示层漂浮js特效代码
- 02. Java环境搭建
- Websphere8.5.5最新补丁包 :WebSphere Application Server V8.5.5 Fix Pack 15(8.5.5.15)
- 暗影精灵3+ ubuntu18.04 安装显卡驱动
- 180512 tensorboard高维数据可视化
- Canvas--画一个圆
- 出现Could not initialize class net.sf.json.JsonConfig错误。解决方法如下:
- ASP.NET Web API与Owin OAuth:使用Access Toke调用受保护的API(二)
- itextpdf text转pdf