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

秋招算法记录 | 排序算法整理 | 直接选择、直接插入、冒泡、快排、希尔排序

直接选择排序 (Selection Sort)

  • 核心思想:每一轮在未排序部分里找最小(或最大)的元素,放到已排序部分的末尾。
  • 流程:
    • 从数组的第一个位置开始,假设它是最小值。
    • 遍历后面的所有元素,找到更小的元素,记录其下标。
    • 一轮结束后,将最小元素和当前位置元素交换。

重复以上步骤,直到所有元素排序完成。

def selection_sort(a):"""直接选择排序:每轮把未排序区的最小值放到前面。"""n = len(a)for i in range(n - 1):min_idx = ifor j in range(i + 1, n):if a[j] < a[min_idx]:min_idx = jif min_idx != i:a[i], a[min_idx] = a[min_idx], a[i]
  • 平均时间复杂度:O(N^2)

直接插入排序 (Insertion Sort)

  • 核心思想:像打扑克牌一样,把新的牌插入到已经排好序的牌堆中合适的位置。
  • 流程:
    • 默认第一个元素已经有序。
    • 取下一个元素(key),和前面有序区的元素依次比较,找到合适位置插入。
    • 插入时要把比它大的元素依次向后移动。
    • 重复直到所有元素处理完。
def insertion_sort(a):"""直接插入排序:像插牌一样,把当前元素插到有序区合适位置。"""for i in range(1, len(a)):key = a[i]  # "下一个元素"j = i - 1while j >= 0 and a[j] > key:a[j + 1] = a[j]j -= 1a[j + 1] = key
  • 平均时间复杂度:O(N^2)

冒泡排序 (Bubble Sort)

  • 核心思想:相邻元素两两比较,大的往后“冒泡”,小的往前“沉”。
  • 流程:
    1. 从头到尾,比较相邻两个数,如果前一个比后一个大,就交换。
    2. 一趟结束后,最大值会沉到最后。
    3. 对剩余未排序部分重复这个过程,直到只剩一个元素。
def bubble_sort(a):"""冒泡排序(含短路优化):一趟把最大值“冒”到末尾。"""n = len(a)for i in range(n - 1):swapped = Falsefor j in range(0, n - 1 - i):if a[j] > a[j + 1]:a[j], a[j + 1] = a[j + 1], a[j]swapped = Trueif not swapped:  # 已经有序,提前结束break
  • 平均时间复杂度:O(N^2)

快速排序 (Quick Sort)

  • 核心思想:分治法。选一个“基准值 (pivot)”,把数组分成两部分:小于基准值的放左边,大于基准值的放右边,然后递归排序。
  • 流程:
    1. 在数组中选择一个基准值(常见做法是第一个或最后一个元素)。
    2. 将数组划分为左右两个子区间:
      • 左边都是小于等于基准值的元素;
      • 右边都是大于基准值的元素。
    3. 对左右两个子区间分别递归执行快速排序。
    4. 最终拼接:左子区间 + 基准值 + 右子区间。
def quick_sort(a):"""快速排序(就地、双向指针分区;不使用切片,避免额外 O(n) 空间)。"""def _qs(lo, hi):if lo >= hi:returni, j = lo, hipivot = a[(lo + hi) // 2]  # 取中点作基准(降低退化概率)while i <= j:while a[i] < pivot:i += 1while a[j] > pivot:j -= 1if i <= j:a[i], a[j] = a[j], a[i]i += 1j -= 1if lo < j:_qs(lo, j)if i < hi:_qs(i, hi)_qs(0, len(a) - 1)
  • 平均时间复杂度:O(N logN)

希尔排序

待补充


对比

算法最好时间平均时间最坏时间额外空间稳定性备注
直接选择排序O(n^2)O(n^2)O(n^2)O(1)不稳定交换次数 ≤ (n-1),比较次数固定约 n(n-1)/2
直接插入排序O(n)O(n^2)O(n^2)O(1)稳定对“基本有序”数据非常高效
冒泡排序(含短路)O(n)O(n^2)O(n^2)O(1)稳定已有序时一趟即可结束
快速排序(原地)O(n log n)O(n log n)O(n^2)期望 O(log n)(递归栈)不稳定随机/三数取中可降低退化概率
http://www.dtcms.com/a/418738.html

相关文章:

  • Docker 容器如何实现隔离
  • ThinkPHP8学习篇(八):数据库(四)
  • 专业商城网站设计制作wordpress用户中心制作
  • 加强住房公积金网站建设搜索推广的优势
  • 【BTC】比特币脚本
  • 人工智能吉他教学研究:基于Liberlive与TemPolor的产品与教学思考[特殊字符]
  • 电脑开机显示屏显示无信号怎么办 原因及解决方法
  • 怎么攻击织梦网站网站发布 图片看不到
  • ROS1 go2 vlp16 局部避障--3 篇
  • 【奇怪的bug】lua的nil不报错
  • 有哪些做短租的网站好浙江省建设厅网站查询
  • 南宁网站建设优势吉林省软环境建设办公室网站
  • 【数据结构】二叉树-图解深度优先搜索(递归法、迭代法)
  • 邯郸企业网站建设报价接收新网站如何做诊断
  • 做体力活的网站上海网站制作公司哪
  • Jenkins运维之路(Jenkins使用Mysql作为信息存储)
  • 爬虫访问第三方 HTTPS 网站时遇到的 SSL 异常处理
  • JavaWeb 课堂笔记 —— 22 登录校验
  • 整合营销传播案例广西网络优化seo
  • Mac电脑解决 npm 和 Yarn 安装时的证书过期问题
  • JavaScript继承详讲
  • 怎么理解ES的shard和segment
  • AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
  • 新乡网站关键词优化电商网站开发实战视频教程
  • 公司无网站无平台怎么做外贸wordpress检查php版本号
  • Spark核心Shuffle详解(二)ShuffleHandler
  • React Native启动性能优化实战:Hermes + RAM Bundles + 懒加载
  • 怎么做淘宝客个人网站wordpress可视化编辑插件下载
  • [C++项目框架]gflags和gtest的简单介绍
  • Vue2 和 Vue3 中使用 Vue Router 的详细过程