MergeSort与QuickSort的详细分析
2017-11-07 21:22
375 查看
归并排序和快排的区别
MergeSort和QuickSort是两种比较类似的sort方式,他们都是通过Divide and Conquer来实现的。都需要使用recursion的方式进行排序。归并排序和快排是两种比较类似的排序方式, 他们都是通过分割和占领来实现, 都需要使用递归进行排序
相同之处:原理上一致。切分->合并
切片,将N个元素分成两部分进行排序,每个子部分也会再继续分成两部分排序,直到只有2个元素进行比较排序。这就用到递归。把排序好的每个元素再合并起来组成有序列表,这个就是合并( merge ),或者说是占领( conquer )。这两种Sort都需要合并这一步骤,但是细节不同。
不同之处:合并细节不同
- 归并排序:
切片比较简单,将所有元素以二分法方式分割,就是说分开后左边与右边元素的个数是相等的,或者相差 1(比如5个,分成左3、右2)。分割过程的复杂度只需计算为1就可以了。合并部分相对复杂。当所有元素被分为很多个小部分进行排序后,每个小部分里面的元素都是排好顺序的,然后需要和另一个小部分里的元素排序。因为在切片的时候是以二分法方式分开的,左边和右边的元素没有任何大小关系,所以在合并的过程中需要将左边部分的元素与右边部分的元素逐一比较然后存储在一个新的 list 里面。这样,合并过程的复杂度为N。
合并排序的复杂度为 N+2T(N/2) (这里的第一个N是指合并的复杂度)。最终复杂度为NlgN.
- 快排
切片复杂,而且有多种方法,方法一:使用第一个元素做为比较标准值,然后把比这个标准值小的所有元素放左边,大的放在右边,这样得到的两个部分左边任意元素都比右边任意元素小。
方法二:使用中间值作为比较标准值。我们选择标准值的标准是尽量选择不大不小接近中间的元素,这样根据这个标准值所分开的两部分的数量不会相差太大。
如果使用方法一,而 list 中的元素刚好又是已排好序的,那划分的两部分数量悬殊,算法复杂度非常高,为N*N。
一般情况,快排的切片的复杂度为N. 假设快排的切片方法分开后的所有小部分为 a, b, c… 那么 a 中的所有元素都比 b 中的小,b 中的所有元素比 c 中的小。这样在合并的时候非常简单,只要把 a, b, c…里的元素排好顺序,然后把 b 直接放在 a 后面就好了。这里的复杂度只有1。所以整个快排的复杂度为 N+2T(N/2) 这里的第一个N指切片的复杂度。最终复杂度为NlgN.
总体来说,快排的切片复杂合并简单,归并排序的切片简单合并复杂。了解原理后就可以根据不同情况选择不同的排序方法。
转自:http://blog.csdn.net/qt_pixie/article/details/1361777
相关文章推荐
- MergeSort与QuickSort的详细分析
- 【数据结构】 MergeSort与QuickSort的详细分析 - 归并排序、快速排序
- 《Linux驱动》iTop4412开发板LCD驱动 详细分析 (二)
- Android 中Makefile的详细分析
- 运放参数的详细解释和分析-part23, 输出短路电流
- 详细分析apache httpd反向代理的用法
- android待机详细结合代码分析(一)
- 新版“机器狗”病毒详细分析资料
- [详细分析]实现一个8bit数据(unsigned char)的指定位的置0或者置1操作,并保持其他位不变
- Android PackageManagerService详细分析
- NTFS文件系统详细分析
- 死锁分析,死锁详细介绍
- Android:这是一份全面 & 详细的Retrofit 2.0 源码分析指南
- Android GSM驱动模块详细分析
- android关于AndroidManifest.xml详细分析
- Ubuntu系统详细分析【31-40】
- 超详细mysql left join,right join,inner join用法分析
- crond定时任务详细分析
- 详细分析 javascript 的内存分配
- 飘雪(piaoxue/feixue)的详细分析以及手工清除办法[10/26更新]