排序趟数问题

news/2025/2/26 6:14:54

1. 冒泡排序

  • 趟数:最多 n-1 趟(n为元素个数)
  • 每趟操作:比较相邻元素,将最大元素“冒泡”到末尾。
  • 优化:若某趟无交换,可提前终止(如数组已有序时仅需1趟)。
  • 示例
    • 数组 [5,3,1,2,4] 需要4趟完成排序。

2. 选择排序

  • 趟数:固定 n-1 趟
  • 每趟操作:每趟选择未排序部分的最小元素,与当前趟首位交换。
  • 特点:无论数据是否有序,均需完整执行所有趟。
  • 示例
    • 数组 [5,3,1,2,4] 固定需要4趟。

3. 插入排序

  • 趟数n-1 趟
  • 每趟操作:每趟将当前元素插入已排序部分的正确位置。
  • 优化:若数据基本有序,每趟插入操作时间接近O(1)。
  • 示例
    • 数组 [1,2,3,5,4] 需要4趟,最后一趟将4插入正确位置。

4. 快速排序

  • 趟数:平均递归深度为 log n 层(非严格“趟数”)
  • 每趟操作:每层递归进行一次分区(Partition),将数组分为左右子区间。
  • 特点
    • 实际趟数与分区的平衡性相关(如最坏情况单趟分割为 O(n) 层)。
  • 示例
    • 数组 [3,1,2,5,4] 平均需要约 log 5 ≈ 3 层递归完成排序。

5. 归并排序

  • 趟数log n 趟合并(每趟合并相邻子数组)
  • 每趟操作:自底向上逐层合并子数组(如长度为1→2→4→8…)。
  • 示例
    • 数组 [5,3,1,2,4] 需要3趟合并(合并至长度8时结束)。

6. 堆排序

  • 趟数n-1 趟交换+调整
  • 每趟操作
    1. 建堆后,每次将堆顶元素(最大值)与末尾交换(1趟交换);
    2. 调整剩余堆(每趟调整复杂度为O(log n))。
  • 示例
    • 数组 [5,3,1,2,4] 需要4趟交换完成排序。

7. 基数排序(LSD)

  • 趟数:等于数据最大位数 d
  • 每趟操作:按某一位分配到桶中,再按桶顺序收集数据。
  • 示例
    • 排序 [170, 45, 75, 90, 802],最大位数3,需3趟(个位→十位→百位)。

8. 希尔排序

  • 趟数:取决于增量序列(如 gap = n/2, n/4, ..., 1
  • 每趟操作:每趟按不同间隔进行插入排序。
  • 示例
    • 数组 [5,3,1,2,4] 使用增量序列 [2,1],需2趟。

总结

算法趟数定义是否与数据相关
冒泡排序最多 n-1 趟是(可提前终止)
插入排序n-1 趟是(数据有序时高效)
归并排序log n 趟合并否(固定分治策略)
基数排序d 趟(d为位数)
快速排序平均 log n 层递归是(依赖分区平衡性)

注意事项

  1. 趟数 ≠ 时间复杂度:例如插入排序每趟操作复杂度为O(n),但总时间复杂度仍为O(n²)。
  2. 实际应用:优先关注时间复杂度、空间复杂度及稳定性,而非单纯趟数。
  3. 优化算法:如Timsort会根据数据特征动态调整策略,趟数不固定。

http://www.niftyadmin.cn/n/5868164.html

相关文章

如何获取zookeeper中的注册内容,在Java项目中演示

我来为你展示如何在Java项目中通过ZooKeeper获取已注册的内容。下面提供一个完整的示例,包括连接ZooKeeper、获取节点数据以及处理常见情况的代码。 示例代码 以下代码演示了如何从ZooKeeper中获取注册内容: import org.apache.zookeeper.*; import ja…

smolagents学习笔记系列(六)Secure code execution

这篇文章锁定官网教程 Secure code execution 章节的内容,主要介绍了smolagents是如何安全地执行LLM的输出结果。 官网链接:https://huggingface.co/docs/smolagents/v1.9.2/en/tutorials/secure_code_execution 为了不浪费你的时间,下面这…

JAVAweb之过滤器,监听器

文章目录 过滤器认识生命周期FilterConfigFilterChain过滤器执行顺序应用场景代码 监听器认识ServletContextListenerHttpSessionListenerServletRequestListener代码 过滤器 认识 Java web三大组件之一,与Servlet相似。过滤器是用来拦截请求的,而非处…

python绑定udp时使用127.0.0.1作为ip,无法sendto,报错Invalid argument

在 Python 中使用 UDP 套接字进行通信时,绑定127.0.0.1作为 IP 地址后无法使用sendto方法发送数据,可能由多种原因导致 这里是其中一个原因: 127.0.0.1 是本地回环地址,只能用于本机内部的进程间通信, 如果你绑定到 …

《OpenCV》—— 背景建模

背景建模是什么? 背景建模的意义? 通过背景建模,我们可以实现很多应用,例如运动检测、目标跟踪 背景建模的方法 帧差法 帧差法的原理 基于 K 近邻的前景分割算法(KNN) 原理 基于 K 近邻的前景分割算法…

pytest下放pytest.ini文件就导致报错:ERROR: file or directory not found: #

pytest下放pytest.ini文件就导致报错:ERROR: file or directory not found: # 如下: 项目文件目录如下: pytest.ini文件内容: [pytest] addopts -v -s --alluredir ./allure-results # 自动添加的命令行参数:# -…

【利用conda配置管理Python版本和依赖环境】

1. 创建新的Python环境 # conda create -n [虚拟环境名] python[python指定的版本] # -y直接安装不用询问,没有时,会提示询问等待用户确定才安装 conda create -n pygnu python3.10 -y验证并检查新建的Python环境 conda activate pygun python --versi…

uni-app 开发 App 、 H5 横屏签名(基于lime-signature)

所用插件&#xff1a;lime-signature 使用到 CSS 特性 绝对定位transform 旋转transform-origin transform 原点 复习一下定位元素&#xff08;相对定位、绝对定位、粘性定位&#xff09; 代码# <template><view class"signature-page"><view clas…