首页 > 编程语言 >常用的排序算法性能分析(2)—— 归并排序、快速排序

常用的排序算法性能分析(2)—— 归并排序、快速排序

时间:2023-06-06 22:01:01浏览次数:44  
标签:归并 底向上 算法 NlgN 数组 排序 快速


归并排序


要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。


自顶向下的归并排序


归并排序应用了分治的思想,如果它能将两个子数组排序,它就能够通过归并两个子数组来将整个数组排序。

命题F:对于长度为 N 的任意数组,自顶向下的归并排序需要 (1/2)*NlgN  到 NlgN 次比较。

命题G:对于长度为 N 的人艺术组,自顶向下的归并排序最多需要访问数组 6NlgN 次。
因为递归会使小规模问题中方法的调用过于频繁,使用插入排序处理小规模子数组(比如长度小于15)一般可以将归并排序的运行时间缩短 10%-15%。


如果 arr[mid] <= arr[mid+1],就认为数组已经是有序的,跳过 merge() 方法。这个改动不影响排序的递归调用,但是任意有序的子数组算法的运行时间就变为了线性的。


当把辅助数组 aux[] 声明为 merge() 方法的局部变量时,即使每次归并很小的数组,都需要创建新的数组,这样创建新数组将成为归并排序运行时间的主要部分。更好的解决方案是将 aux[] 变为 sort() 方法的局部变量,并将它作为参数传递给 merge() 方法。

自底向上的归并排序


自底向上的归并排序是,先归并那些微型数组,然后再成对归并得到的子数组,如此这般,直到将整个数组归并到一起。

命题H:对于长度为 N 的任意数组,自底向上的归并排序需要 (1/2)NlgN 至 NlgN 次比较,最多访问数组 6NlgN 次。

自底向上的归并排序比较适合用链表组织的数据,只需要重新组织链表的链接就能将链表原地排序。


快速排序


快速排序切分方法的内循环会用一个递增的索引将数组元素与一个定值比较。归并排序和希尔排序一般较慢的原因是,它们在内循环中移动数据。

快速排序另一个优势是它的比较次数很少。

快速排序的最好情况是每次都正好能将数组对半分。

命题K:将长度为 N 的无重复数组排序,快速排序平均需要 ~2NlnN 次比较(以及1/6的交换)。

命题L:快速排序最多需要约 N^2/2 次比较,但随即打乱数组能够预防这种情况。

在快速排序中,对于小数组,使用插入排序,在 5~15之间的人一直在大多数情况下都让人满意。

对于包含大量重复元素的数组,三向切分快速排序的排序时间从线性对数降低到了线性时间。


常用的排序算法性能分析(2)—— 归并排序、快速排序_排序算法


标签:归并,底向上,算法,NlgN,数组,排序,快速
From: https://blog.51cto.com/u_16152603/6428553

相关文章

  • 浅谈二次剩余与Cipolla算法
    Preface数论菜鸡来补一手知识黑洞,二次剩余以前OI时期还真一点没了解过,所以先写个板题先(虽然当初想着反正到时候有数学巨佬队友带我飞,但多学一点总是好的)二次剩余又俗称模意义下开根,用于求解\(x^2\equivn\pmodp\)这样的方程但注意一般情况下我们只讨论当\(p\)为奇素数时的情......
  • 文心一言 VS 讯飞星火 VS chatgpt (33)-- 算法导论5.2 5题
    五、设A[1..n]是由n个不同数构成的数列。如果i<j且A[i]>A[j],则称(i,j)对为A的一个逆序对(inversion)。(参看思考题2-4中更多关于逆序对的例子。)假设A的元素构成(1,2,…,n)上的一个均匀随机排列。请用指示器随机变量来计算其中逆序对的数目期望。文心一言:假设A的元素构成(1,2,...,......
  • 2023-06-06:给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。 对位
    2023-06-06:给你二叉树的根结点root,请你设计算法计算二叉树的垂序遍历序列。对位于(row,col)的每个结点而言,其左右子结点分别位于(row+1,col-1)和(row+1,col+1)树的根结点位于(0,0)。二叉树的垂序遍历从最左边的列开始直到最右边的列结束,按列索引每一列上......
  • 2023-06-06:给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。 对位
    2023-06-06:给你二叉树的根结点root,请你设计算法计算二叉树的垂序遍历序列。对位于(row,col)的每个结点而言,其左右子结点分别位于(row+1,col-1)和(row+1,col+1)树的根结点位于(0,0)。二叉树的垂序遍历从最左边的列开始直到最右边的列结束,按列索引每一......
  • 8.插入排序
      插入排序算法是一种简单的排序算法,也成为直接插入排序算法。它是一种稳定的排序算法,对局部有序的数据具有较高的效率。  插入排序算法是一个对少量元素进行排序的有效算法。比如,打牌是我们使用插入排序方法最多的日常生活例子。我们在摸牌时,一般会重复一下步骤。起初,我们手......
  • 熄灯之后的学习——再读《MySQL必知必会》(4)|| 排序数据
    子句(clause):SQL语句由子句构成,有些子句是必须的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。orderbyxxx指定以xxx列进行排序按多个列排序:只要指定列名,列名之间用逗号分开即可。在按多个列进行排序的时候,排序完全按所规定的顺序进行。降序排序:必须指定DES......
  • 算法 in Golang:Recursion(递归)
    算法inGolang:Recursion(递归)递归算法场景:在套娃中找到宝石可以这样做while没找到:if当前项is宝石:return宝石elseif当前项is套娃:打开这个套娃if当前项is宝石:return宝石elseif当前项is套娃:打开这个套娃if当前项is宝石:............
  • 【反演】基于遗传算法实现均匀地层模型随钻电磁波测井反演附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 关于Yolov3-Tiny算法
    1.Yolov3-Tiny模型YOLOv3-Tiny网络模型一共有24层,包括13个卷积层,6个最大池化层,2个route层,1个上采样层以及2个输出Yolo层。一共有13层卷积层,网络参数及计算量适中,适合在ZYNQ嵌入式平台上加速。1.1卷积层目的:提取输入特征图多个层次的特征。假设卷积层有N组卷积核(每组卷......
  • 0007.有监督学习之集成学习(Adaboost算法)
    一、集成学习概述1.集成学习算法定义集成学习(Ensemblelearning)就是将若干个弱分类器通过一定的策略组合之后产生一个强分类器。弱分类器(weakClassifier)指的就是哪些分类准确率只比随机猜测略好一点的分类器,而强分类器(StrongClassifier)的分类准确率会高很多。这里的“强”&......