MergeSort与QuickSort的详细分析

【快速排序】算法设计课程——Split算法的两种方式 一、快速排序的基本介绍 多的就不说了,自己百度百科 二、核心思想 分治 三、代码 嘿嘿,我其实就是来贴代码的 def SPLIT(A,low,high): i = low x = A[low] for j in range(low+1,high+1): if A[j] <= x: i += 1 if i ... 阅读详情
 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简单。了解原理后就可以根据不同情况选择不同的排序方法。
高效的并行排序算法MergeSortQuickSort的并行化实现 MergeSort是一种分治法的排序算法,其基本思想是将一个大问题分解为若干个子问题,再逐步解决这些子问题。它的时间复杂度为O(n log n),无论在最坏、最优还是平均情况下,性能都非常稳定。QuickSort也是一种分治法的排序算法,通过选择一个“基准”元素,将数据集分为左右两部分,分别对两部分数据进行排序。QuickSort在平均情况下的时间复杂度为O(n log n),但最坏情况下为O(n^2),不过它通常较MergeSort更快,因为其常数项较小。 阅读详情

相关推荐

2025年06月中国电子学会青少年软件编程(图形化)等级考试试卷(三级)答案 + 解析

2025年06月中国电子学会青少年软件编程(图形化)等级考试试卷(三级)答案 + 解析

伶俐角少儿编程 303

MergeSortL && QuickSort

编写程序实现归并排序算法 MergeSortL 和快速排序算法 QuickSort;

Python爬虫实战:新浪财经股票金融数据全方位抓取教程

本教程系统介绍了新浪财经股票数据爬取技术,从静态网页解析、实时接口请求到异步爬取和数据存储,帮助你搭建了一个完整的金融数据采集流程。未来,可以结合深度学习模型进行行情预测,或者将数据接入量化交易系统,实现自动化投资。

2201_76125261的博客 2169

冒泡排序(Bubble Sort)、快速排序(Quick Sort)和归并排序(Merge Sort)

冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,依次比较相邻两个元素,如果它们的顺序错误就交换它们。快速排序是一种基于分治思想的高效排序算法,它选取一个元素作为基准值,将数组分为小于基准值和大于基准值的两个子数组,然后对这两个子数组进行递归排序,最终得到有序数组。归并排序也是一种基于分治思想的排序算法,它将数组划分为较小的子数组,然后对子数组进行递归排序,最终通过合并操作得到有序数组。归并排序的时间复杂度为 O(nlogn),但需要额外的空间来存储合并过程中的数组。

m0_70577179的博客 1015

常见排序算法原理及实现——第二部分(归并排序、快速排序、堆排序)

常见排序算法原理及实现——第二部分(归并排序、快速排序、堆排序)

weixin_46935110的博客 1185

快速排序归并排序

快速排序和归并排序是两种常见且高效的排序算法,它们都基于比较操作来实现数据排序。快速排序通过选择基准元素将待排序数据划分成左右两个子序列,然后递归对子序列排序;归并排序通过递归地将待排序数据分割成较小的子序列,然后合并排序好的子序列。在实际应用中,我们可以根据具体需求选择合适的排序算法

qq_62800805的博客 1157

【排序算法】归并排序快速排序:深入解析比较

无论是在数据库操作中的数据检索,还是在高效算法的设计中,良好的排序机制都能显著提升性能和效率。合并时,从两个数组的起始位置开始比较,选择两者中较小的元素放入结果数组中,然后移动指针,重复此过程,直到所有元素都被合并。分区策略: 快速排序通过选择一个基准元素,然后重新排列数组,使得所有小于基准的元素都移到基准的左边,所有大于基准的元素都移到基准的右边。基准元素的选择: 基准的选择可以多样化,常见的方法包括选择第一个元素、最后一个元素、中间元素,或者随机选择一个元素作为基准。归并排序是一种稳定的排序算法

Ricky的博客 6667

归并排序(MergeSort)和快速排序(QuickSort)

归并排序和快速排序 1.归并排序 归并排序(MergeSort)和快速排序(QuickSort)就是把数组的数,分为一个个有序的个体,再两两结合. 对给定数组排序升序:[8,4,5,6,2,1,7,3] 1.先将其分为一个个有序的个体:[8],[4],[5].[6].[2].[1],[7],[3] 2.两两合并并保持有序:[4,8],[5,6],[1,2],[3,7] 3.继续合并

Veng的博客 1221

用批处理文件删除n天前的文件(转)+XP不支持forFiles命令解决

用批处理文件删除n天前的文件(转)+XP不支持forFiles命令解决 2010年08月10日   公司服务器用来备份数据的硬盘过段时间就会被备份文件占满,弄得我老是要登录到服务器去手工删除那些老的文件,有时忘记了就会导致硬盘空间不足而无法备份。   因为只要保留最近几天的备份,如果可以做一个批处理让系统自动删除老备份文件就好了,但是Windows的命令行和Linux的Shell比起...

kuh796xv 818

merge sort 和 quick sort

归并排序 (Merge sort) 核心思想是:分治法(divide-and-conquer),时间复杂度是O(nlogn)O(nlogn)O(nlogn)。 首先,什么是分治法? 这里用一个经典问题来说明:假设给你27枚硬币,其中有一个假币会比真的轻一点,你有一个天平,如何仅测量三次来找到这枚假币呢? 答:先把硬币分成三等份每份9个,一次测量便可得知最轻的是哪9枚硬币。然后再平分三份每份3枚,测量,再平分三份……这样便可三次得出结果 归并排序是分治法的典型应用,这个算法顾名思义,就是要更高效地实现排序

weixin_41989712的博客 324

QuickSortMergeSort对比小结

1) QuickSort的时间复杂度平均是O(nlogn),但最坏情况下是O(n^2)。MergeSort的时间复杂度严格来说就是O(nlogn)。那为什么实际应用中QuickSort用得多呢?因为MergeSort需用分配额外的O(n)空间,当用到new函数的时候会消耗很多的系统时间。另外像JAVA里面还要garbage collection又消耗一些时间。所以总体上来说MergeSort的ov...

roufoo的博客 4041

Quick Sort & Merge Sort

两种排序均采用分治的思想:quick sort先整体有序,再局部有序。归并排序先局部有序,再整体有序。 目录: quick sort 和 merge sort 的比较 quick sort merge sort 1. quick sort 和 merge sort 的区别于联系 1). 时间复杂度:都是O(nlogn),但是快速排序是平均O(nlogn),归并排序是最好最坏都是O(nlogn)...

weixin_43551229的博客 608

Merge Sort (Recursion) Test

#include"MyOutput.hpp" template&lt;typename T&gt; void MergeSortedArray(T a[],int alen,T b[],int blen){ T *t = new T[alen+blen]; int i = 0; int j = 0; int k = 0; while(i &lt; a...

修也 427

归并排序(MergeSort)的原理及延伸性思考

前面一篇博文写了归并排序的算法实现,虽然做了些注释,但没有写归并排序的原理,这篇就补上,同时对归并所隐含的思想做一个探讨。 1)归并排序的原理 为了便于说明,这里我们提到的已排好序的序列都是指从小到大的升序(对于降序其实原理是一样的。 假设有两个已排好序的序列A,B: A:a1≤a2≤a3≤...≤an (i:1~n为下标); B:b1≤b2≤b3≤...≤bm(j:1-m为下标...

javasalatu 262

单链表的排序 快速排序 归并排序 quicksort mergesort

原理都很简单,关键是某些边界能否正确写对: Node *quicksort(Node *head, Node* tail) { Node d1(0), d2(0), *cur = head, *c1 = &d1, *c2 = &d2, *pivot = head; if (head == NULL || head == tail || head->ne...

taoqick的专栏 1514

QuickSort--Split

  static int Split(int[] arr, int first, int last)   { int splitPos = first; int pivot = arr[first]; int lastExchangePos = first; ...

weixin_30922589的博客 120

图解快速排序算法-02

图解快速排序算法(补充) 关于快速排序算法的两种实现(split、partition)在上一篇”快速排序算法的两种Java实现及图解“中已经通过图示详细说明,并且也附上了Java代码。 但是,第二种实现方法(partition)的代码中有一点需要注意的,没有强调,并且也没有给予解释。 /** * (6)-6.2 快速排序 * 双指...

Leonardo_KY的博客 872

150道历年PMP考试试题及答案解析.pdf

150道历年PMP考试试题及答案解析.pdf

上一篇: 李开复:21世纪7种人才最抢手
qt_pixie
博客等级 码龄20年 1粉丝 2原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值