news 2026/5/25 11:03:04

插入排序算法实现(二分查找搜索版本)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
插入排序算法实现(二分查找搜索版本)

我来为你写一个完整的C语言二分插入排序程序。

#include<stdio.h>// 二分查找插入位置intbinarySearch(intarr[],intleft,intright,intkey){while(left<=right){intmid=left+(right-left)/2;if(arr[mid]==key){returnmid+1;// 保持稳定性,插入到相同元素的后面}elseif(arr[mid]<key){left=mid+1;}else{right=mid-1;}}returnleft;// 返回插入位置}// 二分插入排序voidbinaryInsertionSort(intarr[],intn){for(inti=1;i<n;i++){intkey=arr[i];// 当前要插入的元素intj=i-1;// 使用二分查找找到插入位置intpos=binarySearch(arr,0,j,key);// 将插入位置之后的元素后移while(j>=pos){arr[j+1]=arr[j];j--;}// 插入元素arr[pos]=key;}}// 打印数组voidprintArray(intarr[],intn){for(inti=0;i<n;i++){printf("%d ",arr[i]);}printf("\n");}intmain(){intarr[]={64,34,25,12,22,11,90,88,75,50};intn=sizeof(arr)/sizeof(arr[0]);printf("原始数组: ");printArray(arr,n);binaryInsertionSort(arr,n);printf("排序后数组: ");printArray(arr,n);return0;}

程序说明:

  1. 算法思想

· 将数组分为已排序和未排序两部分
· 对未排序部分的每个元素,使用二分查找在已排序部分找到插入位置
· 然后移动元素并插入

  1. 时间复杂度

· 最好情况:O(n) - 数组已经有序时
· 平均情况:O(n²) - 但比较次数比普通插入排序少
· 最坏情况:O(n²) - 但移动元素的次数与普通插入排序相同

  1. 空间复杂度

· O(1) - 原地排序,只需要常数级别的额外空间

  1. 优化点

· 使用二分查找减少比较次数(从O(n)降到O(log n))
· 但元素移动的次数没有减少

  1. 变种版本(更简洁的实现):
// 更紧凑的实现方式voidbinaryInsertionSortCompact(intarr[],intn){for(inti=1;i<n;i++){intkey=arr[i];intleft=0,right=i-1;// 二分查找插入位置while(left<=right){intmid=left+(right-left)/2;if(arr[mid]>key){right=mid-1;}else{left=mid+1;}}// 移动元素for(intj=i-1;j>=left;j--){arr[j+1]=arr[j];}// 插入元素arr[left]=key;}}
  1. 使用示例
intmain(){// 测试示例1intarr1[]={3,1,4,1,5,9,2,6,5,3};intn1=sizeof(arr1)/sizeof(arr1[0]);printf("示例1 - 原始数组: ");printArray(arr1,n1);binaryInsertionSort(arr1,n1);printf("示例1 - 排序后: ");printArray(arr1,n1);// 测试示例2intarr2[]={100,64,34,25,12,22,11,90};intn2=sizeof(arr2)/sizeof(arr2[0]);printf("\n示例2 - 原始数组: ");printArray(arr2,n2);binaryInsertionSort(arr2,n2);printf("示例2 - 排序后: ");printArray(arr2,n2);return0;}

这个二分插入排序相比普通插入排序的主要优点是减少了比较次数,特别是当数组较大时,这个优势会更明显。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 4:52:19

还在为3DMAX轮胎建模发愁?1分钟一个高质轮胎的秘诀在这里!

3DMAX轮胎生成器插件&#xff0c;是一款专为3dsMax设计、专注于快速生成高质量轮胎模型的脚本插件。其核心目标是帮助用户在制作车轮时快速获得结构合理、细节丰富的轮胎基础模型&#xff0c;尤其适合作为项目流程中的“领先优势”起点。该插件工作流程较为直观&#xff1a;用户…

作者头像 李华
网站建设 2026/5/26 4:53:26

想极致优化Windows,还得看这些 系统调教神器_优化小工具

给大家分享几款自己一直在用的 Windows 系统调教小工具&#xff0c;无论是 Windows 10 还是 Windows 11 用户&#xff0c;都能从中受益。 有系统优化需求的小伙伴&#xff0c;千万别错过&#xff0c;赶紧收藏下载&#xff01; Windows系统调校 绿色版软件 这是一款绿色版软件&…

作者头像 李华
网站建设 2026/5/26 5:57:07

Java 拆分 PDF:使用 Spire.PDF for Java 轻松搞定

在日常的软件开发和数据处理中&#xff0c;PDF 文件因其跨平台、版式固定等特性&#xff0c;被广泛应用于文档传输和存储。然而&#xff0c;有时我们需要对大型 PDF 文档进行精细化管理&#xff0c;例如&#xff0c;将一个多页的合同拆分成单页以便逐页审批&#xff0c;或者从一…

作者头像 李华
网站建设 2026/5/26 4:56:41

零基础入门网络安全:3 个月合规实战路径 + 避坑指南(附真实案例)

零基础入门网络安全&#xff1a;3 个月合规实战路径 避坑指南&#xff08;附真实案例&#xff09; 作为一个从行政转行安全运维、如今主业 SRC 副业月入 1W 的过来人&#xff0c;深知零基础学网安的迷茫 —— 怕学不会、怕踩法律坑、怕学完找不到出路。其实网安行业最不缺的…

作者头像 李华
网站建设 2026/5/25 18:48:10

功率MOSFET特性分析与应用考量:以NCE0208KA为例

当选MOSFET时&#xff0c;参数权衡总是免不了的——特别是在设计那些工作在几十到上百伏电压范围的开关电源或电机驱动电路时。只看数据手册首页的电压电流值远远不够&#xff0c;在实际电路中&#xff0c;器件如何开关、发热多少、能否稳定运行&#xff0c;这些往往更关键。这…

作者头像 李华
网站建设 2026/5/24 5:48:47

python一些小细节

GIL锁&#xff1a; 当python使用多线程的时候&#xff0c; 每个线程通过请求这个锁获取运行权。 结束时归还 async/await/asyncio/gather/create_task/ThreadPool 理解asynciohttps://www.bilibili.com/video/BV1oa411b7c9?spm_id_from333.788.videopod.sections&vd_sour…

作者头像 李华