news 2026/6/13 0:46:22

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

作者头像

张小明

前端开发工程师

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/6/13 7:26:48

不用下载App!iPhone 和安卓手机录屏方法大全

使用手机时&#xff0c;我们经常需要录制屏幕操作&#xff1a;比如保存无法下载的视频、制作教学演示、记录游戏高光时刻&#xff0c;或是保存重要通话内容。其实&#xff0c;无论是安卓还是苹果手机&#xff0c;系统都已内置了录屏功能&#xff0c;无需安装第三方App&#xff…

作者头像 李华
网站建设 2026/6/12 2:27:40

基于springboot和vue框架的选课系统与课程评价整合平台_9dg94p7s

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/6/11 11:43:40

多智能体编队与避障:从理论到实践

多智能体编队与避障 #人工势场#多智能体#编队#避障#拓扑结构#队形变换在智能体协同作业的领域中&#xff0c;多智能体编队与避障是一个极具挑战性和趣味性的话题。想象一下&#xff0c;一群无人机需要以特定的编队飞行&#xff0c;同时还要巧妙地避开途中的各种障碍物&#xff…

作者头像 李华
网站建设 2026/6/12 14:12:06

GitPuk基础到实践,如何详细掌管代码

GitPuk是一款开源免费的代码管理工具&#xff0c;在上一篇已经介绍了如何创建你的第一个GitPuk仓库&#xff0c;这篇文章将介绍如何进行代码管理。 1、通过GitPuk推送代码 1.1 命令关联远程库 在本地的项目里面根据下面的命令&#xff0c;关联GitPuk中创建的代码仓库&#x…

作者头像 李华
网站建设 2026/6/13 8:48:11

starrocks fe一直起不来因为catalog

starrocks3.4.0视图需要用到paimon catalog所以fe一直起不来 报错原因是找不到表或字段类型不匹配 starrocks正常运行时不报字段类型不匹配的错误,但是启动fe的时候报错 解决办法 fe conf增加配置 忽略视图异常 ignore_materialized_view_errortrue

作者头像 李华