当前位置: 首页 > news >正文

查缺补漏----内部排序算法排序趟数和比较次数

排序趟数

插入排序(分为直接插入排序和折半插入排序):每趟确定一个元素,排序趟数固定为n-1,和序列初始状态无关。

希尔排序:希尔排序的趟数取决于所选的d(增量序列)。不同的增量序列会导致不同的排序趟数。

冒泡排序:冒泡排序的趟数是1~n-1,和初始序列有关。
快速排序算法:排序的趟数为\left \lfloor log_2n \right \rfloor+1~n(递归深度),具体取决于序列的原始状态(还取决于划分方法,例如枢轴元素的位置)

对于\left \lfloor log_2n \right \rfloor+1的情况,枢轴每次都等分子表:

对于n的情况,递归树退化为单链表:

简单选择排序:简单选择排序每趟都选出一个最小(或最大)的元素,排序的趟数固定为n-1。与序列的原始状态无关。

堆排序:固定n-1趟排序(总共n-1趟的交换和建堆)。

归并排序:归并的趟数固定为\left \lceil log_2n \right \rceil趟。

基数排序:每趟都要进行分配和收集,排序趟数固定为d,和序列初始状态无关。

看下下面两道题:

我并没有看到题目有明显的暗示两者的区别,解析说的是第1题指的是交换趟数,所以不计最后一趟无交换排序,大家自行理解下。

比较次数:

直接插入排序:比较次数与初始序列。在最好情况下,直接插入只需要n-1次比较操作,且不需要交换操作。最坏情况:\frac{n(n-1)}{2}(不带哨兵)。在平均情况和最坏情况下,直接插入的比较和交换操作都需要O(n^2)次比较。
折半插入排序:

折半插入排序每趟的比较次数都为O(log2m)(m为当前已排序好的子序列的长度),因此总比较次数的确定的。

这里补充一下:折半查找的最多比较次数是\left \lfloor log_2n \right \rfloor+1
希尔排序:希尔排序的比较次数也取决于增量序列。
冒泡排序:比较次数与初始序列有关。冒泡排序最好情况下只需要一趟排序过程就可以完成,只需要n-1次比较操作,不需要交换操作。最坏情况:\frac{n(n-1)}{2}
快速排序算法:比较次数与初始序列有关,最多比较次数与最少比较,以8个元素为例:

简单选择排序:总比较次数固定,并且为\frac{n(n-1)}{2}。但是移动次数与序列的初始排列有关,最好情况是不移动,最坏情况是n-1次移动,如果算上每次的3条赋值语句:

void swap(int *a, int *b)
{
int temp;;
temp = *a;
*a = *b;
*b = temp;
}

最坏情况应该是3(n-1)次移动次数。

堆排序:比较次数与初始序列有关(例如某元素只有左孩子,只用和左孩子比较(比较1次),若某元素有左,右两个孩子,则比较次数为2。即左,右孩子先比较,再与父结点比较)。

对于插入和删除堆元素:

查缺补漏----堆排序易错点_将关键字依次插入到大根堆和直接构造大根堆做法一样吗-CSDN博客

归并排序:和序列初始状态有关,比较次数不确定。

若两个递增序列进行归并,一个表长为m,一个为n,那么最多比较次数m+n-1,最少则是min{m,n}。

基数排序:不是基于比较的排序算法。


http://www.mrgr.cn/news/68187.html

相关文章:

  • YOLO11改进 | 融合改进 | C3k2融合 Context Anchor Attention 【两个版本融合-独家创新】
  • 直播系统搭建教程安装说明
  • 【vue2.0入门】认识vue工程
  • 基于python多准则决策分析的汽车推荐算法设计与实现
  • 996引擎 - 活捉NPC
  • 基于 JAVASSM(Java + Spring + Spring MVC + MyBatis)框架开发一个九宫格日志系统
  • SQLI LABS | Less-33 GET-Bypass AddSlashes()
  • RCE漏洞分析
  • OSS和FastDFS的区别
  • 【如何在 Linux 和 Android 系统中杀死进程】
  • 火语言RPA流程组件介绍--获取窗口对象
  • C# 与 C++ 跨进程通信:使用 RabbitMQ 实现消息队列通信
  • Golang | Leetcode Golang题解之第547题身份数量
  • API网关之Gravitee
  • 基于ViT的无监督工业异常检测模型汇总
  • 如何在 Linux 系统中通过进程名杀掉蓝牙进程
  • Meta AI最新推出的长视频语言理解多模态模型LongVU分享
  • Verilog可综合语法
  • C语言 | Leetcode C语言题解之第546题移除盒子
  • SQLI LABS | Less-32 GET-Bypass Custom Filter Adding Slashes To Dangerous Chars
  • B+树与聚簇索引以及非聚簇索引的关系
  • C++ | Leetcode C++题解之第546题移除盒子
  • Docker部署Redis主从复制
  • 看了《逆行人生》,我想到的是程序员的出路不只有外卖员,转型自媒体博主:或许是技术与内容的双向奔赴
  • Golang | Leetcode Golang题解之第546题移除盒子
  • 【划分型 DP】力扣139. 单词拆分