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

数据结构——折半插入排序

折半插入排序

直接插入排序在确定插入位置时,需要逐个比较已排序区间的元素,当已排序区间较长时,比较次数较多。折半插入排序则利用“已排序区间是有序的”这一特性,通过折半查找快速确定插入位置,从而减少比较次数,是对直接插入排序的高效优化。

1. 折半插入排序的执行流程

我们以数组arr = {49, 38, 65, 97, 76, 13, 27, 49}为例,详细演示折半插入排序的每一步:

  • 初始状态:已排序区间为[49],未排序区间为{38, 65, 97, 76, 13, 27, 49}
  • 第1次插入(处理38)
    目标是将38插入到已排序区间[49]的合适位置。
    ① 折半查找插入位置:定义low=0high=0(已排序区间长度为1),计算mid = (low+high)/2 = 0。比较arr[mid]=493838 < 49,所以插入位置在mid左侧,更新high=mid-1=-1,此时low > high,确定插入位置为low=0
    ② 移动元素并插入:将49后移一位,把38插入到arr[0]位置。数组变为{38, 49, 65, 97, 76, 13, 27, 49},已排序区间扩展为[38, 49]
  • 第2次插入(处理65)
    已排序区间为[38, 49],处理未排序区间的65
    ① 折半查找:low=0high=1mid=(0+1)/2=0。比较arr[mid]=386565 > 38,更新low=mid+1=1;再次计算mid=(1+1)/2=1,比较arr[mid]=496565 > 49,更新low=mid+1=2,此时low > high,确定插入位置为low=2
    ② 移动元素并插入:65直接插入到49后面,数组不变,已排序区间扩展为[38, 49, 65]
  • 第3次插入(处理97)
    已排序区间为[38, 49, 65],处理97
    折半查找后,发现97大于已排序区间的最大元素65,直接插入到末尾,数组不变。
  • 第4次插入(处理76)
    已排序区间为[38, 49, 65, 97],处理76
    ① 折半查找:low=0high=3mid=1arr[1]=49 < 76),更新low=2mid=2arr[2]=65 < 76),更新low=3mid=3arr[3]=97 > 76),更新high=2,此时low > high,确定插入位置为low=3
    ② 移动元素并插入:将97后移,把76插入到6597之间,数组变为{38, 49, 65, 76, 97, 13, 27, 49}
  • 后续插入(处理13、27、49)
    按照同样的折半查找逻辑,13会被插入到最前面,27插入到13之后,最后一个49会插入到已排序区间中第一个49的后面(保持相同元素的相对顺序,算法稳定)。最终数组变为{13, 27, 38, 49, 49, 65, 76, 97}
2. 折半插入排序的代码实现

以下是折半插入排序的C语言实现,核心是用折半查找确定插入位置,再移动元素完成插入:

void BinaryInsertSort(int arr[], int n) {int i, j, low, high, mid, temp;for (i = 1; i < n; i++) {temp = arr[i];            // 取出未排序区间的第一个元素low = 0; high = i - 1;   // 已排序区间的范围[low, high]while (low <= high) {     // 折半查找插入位置mid = (low + high) / 2;if (arr[mid] > temp) high = mid - 1;else low = mid + 1;}for (j = i; j > low; j--) {  // 移动元素,腾出插入位置arr[j] = arr[j - 1];}arr[low] = temp;         // 插入元素}
}

代码说明:

  • 外层循环i遍历未排序区间的起始位置;
  • 折半查找阶段:通过lowhigh缩小范围,最终low即为插入位置;
  • 元素移动阶段:从i位置开始,将元素后移,直到low位置,再将temp插入。
3. 折半插入排序的性能与特性
  • 时间复杂度
    折半查找的时间复杂度为O(log⁡n)O(\log n)O(logn),但元素移动的次数仍与直接插入排序相同,因此整体时间复杂度仍为O(n2)O(n^2)O(n2)。不过,由于减少了比较次数,实际运行效率比直接插入排序更高。
  • 空间复杂度:仅需一个临时变量temp,空间复杂度为O(1)O(1)O(1)
  • 稳定性:相同元素插入时,相对顺序不会改变,因此折半插入排序是稳定的
4. 适用场景

折半插入排序适合已排序区间较长的场景,此时折半查找的优势能充分体现,减少大量比较操作。例如,对基本有序的数组进行排序,或数据量中等(如nnn在几百到几千之间)的情况,它的效率比直接插入排序更优。

综上,折半插入排序通过折半查找优化了“确定插入位置”的过程,在比较次数上有明显优势,且保持了直接插入排序的稳定性和空间效率,是插入排序家族中更高效的实现方式。理解其“折半查找+元素移动”的逻辑,能为后续学习更复杂的排序算法提供思路。

http://www.dtcms.com/a/524278.html

相关文章:

  • io_uring 快吗? Postgres 17 与 18 的基准测试
  • 国产数据库替代MongoDB:政务电子证照新选择
  • 甘孜建设网站集团响应式网站建设
  • 枸杞网站建设方案2024年即将上市的手机
  • Git 版本回退 reset --mixed 命令
  • 博途DWORD中包含word ,字节,位的关系
  • Java Character 类详解
  • 【数据结构】队列“0”基础知识讲解 + 实战演练
  • 【生活】秋冬季节,鼻子很干结痂,扣掉鼻孔干痂流血,鼻塞等护理方法
  • 网站关键词公司百度关键词查询
  • 大模型通识
  • 346. 执行操作后元素的最高频率 I
  • 一些常用的linux操作指令
  • jeecg表单设计器js增强实现效果案例;点按钮出弹框,iframe嵌套,数据传输等
  • Spring IOC源码篇八 核心方法prepareBeanFactory
  • S10--循环队列
  • 基于月尺度水分平衡模型的葡萄园规划与行间管理决策
  • 网站的前期推广网页设计与制作源代码
  • PY32F040单片机介绍(3)
  • 白云网站 建设seo信科上海城市分站seo
  • Python流程控制语法结构-选择分支新特性
  • 快速学完 LeetCode top 1~50 [特殊字符]
  • 河南网站开发培训价格商丘哪里做网站比较好
  • 【常用设计模式全解析】创建型模式(聚焦对象创建机制)、结构型模式(优化类与对象的组合关系)、行为型模式(规范对象间的交互行为)
  • MFF-YOLOv8:基于多尺度特征融合的无人机遥感图像小目标检测
  • SSM框架-MyBatis1
  • 从一开始部署Android项目Sonarqube的自动化扫码+通知+增量扫描功能(Win环境、Docker,基于Jenkins)
  • 对我单位网站进行改版苏州网站建设开发公司
  • 网站架构文案软文推广去哪个平台好
  • 【Cuda C 编程指南第7章 硬件实现】