堆排序:堆排序如何实现?时间复杂度详解

堆排序是利用“堆”(特殊完全二叉树)实现的排序算法,常用大顶堆(父节点≥子节点)。核心思想是“先建堆,再排序”:先将数组转为大顶堆(堆顶为最大值),再反复交换堆顶与末尾元素,调整剩余元素为堆,完成排序。 堆的基本概念:完全二叉树结构,数组中索引i的左子节点2i+1、右子节点2i+2、父节点(i-1)//2。大顶堆父≥子,小顶堆父≤子。 实现分两步:1.构建大顶堆:从最后非叶子节点开始,通过“堆化”(比较父与子节点,交换最大值并递归调整子树)确保大顶堆性质;2.排序:交换堆顶与未排序末尾元素,缩小堆规模后重复堆化,直至完成。 时间复杂度:构建堆O(n),排序过程O(n log n),总O(n log n),空间复杂度O(1)(原地排序)。特点是不稳定,适合大规模数据排序。

阅读全文
使用Python实现基数排序算法

基数排序是一种非比较型整数排序算法,核心思想是按数字每一位(从低位到高位)分桶收集。基本步骤:先确定数组中最大数的位数,再从最低位到最高位,对每一位数字进行“分桶”(0-9共10个桶)和“收集”操作,将当前位数字相同的元素放入同一桶,按桶顺序收集更新数组,直至所有位处理完毕。Python实现通过循环位数、计算当前位数字分桶并收集,时间复杂度为O(d×(n+k))(d为最大数位数,n为数组长度,k=10),空间复杂度O(n+k)。适合位数少的整数数组,处理负数时可先转正数排序再恢复符号。

阅读全文
使用Python实现希尔排序算法

希尔排序是插入排序的改进版,通过分组缩小元素间隔,先“粗排”再“精排”提升效率。核心是选择初始增量(如数组长度的一半),将数组分为若干组,组内元素间隔为增量,对每组用插入排序;随后增量减半,重复分组排序,直至增量为1时完成“精排”。 其关键逻辑是通过分组减少元素移动次数:初始分组大(元素间隔大),先让数组基本有序;逐步缩小增量,最终以插入排序收尾。时间复杂度平均为O(n log n),最坏O(n²),空间复杂度O(1),适用于中等规模、元素分布不均的数组,是原地排序的高效算法。

阅读全文
扑克牌排序启示:插入排序的生活类比与实现

这篇文章介绍了插入排序算法。核心思想是逐步构建有序序列:默认首个元素已排序,从第二个元素起,将每个元素(待插入元素)插入到前面已排序序列的正确位置(需移动较大元素腾出空间)。以数组`[5,3,8,4,2]`为例,演示了从后往前比较、移动元素的过程,关键步骤为:遍历数组,暂存待插入元素,移动已排序元素,插入位置。 算法特点:优点是简单直观、原地排序(空间复杂度O(1))、稳定且适合小规模或近乎有序数据;缺点是最坏时间复杂度O(n²),移动操作较多。总结而言,插入排序是理解排序算法的基础,通过生活类比(如整理扑克牌)帮助理解,适用于简单场景或小规模数据排序。

阅读全文