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

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

我来为你写一个完整的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;}

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

http://www.cnnetsun.cn/news/66413.html

相关文章:

  • 归并排序算法实现,kotlin,c++,python
  • 京东商品列表API,Python请求示例
  • Hadess基础到实践,如何详细管理Npm制品
  • Java 开发问题:类名与注解名冲突问题
  • 如何衡量推广效果(如投产比、转化率)?一位餐饮老板的实战自白
  • 程序员必看!万字长文详解大模型“深度研究“新范式,小白也能入门AI智能体开发!
  • 大模型安全威胁全解析,Agent架构设计避坑指南,小白必看
  • SMDJ45A单向 TVS瞬态抑制二极管 :3000W浪涌保护管 防雷击抗静电
  • Foundation 文本
  • Sui 主网升级至 V1.61.2
  • 25、Kubernetes 应用部署与管理实践
  • 31、容器化应用设计理念与实践
  • 如何评估LobeChat的加载速度与响应延迟?性能基准测试
  • 缓存与数据库一致性解决方案深度解析
  • 消息队列真仙:我的道念支持最终一致性
  • Spring Boot项目推送Gitee全流程(进阶)
  • Java毕设项目:基于Springboot大学校园自习室教室座位预约网站设计与实现基于springboot高校自习室预约系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • JAVA打造同城羽馆预约,一键畅享运动
  • 经验贴 | 科学制定招聘需求与预算:HR 必看的逻辑与实操要点
  • 经验贴 | AI 面试评估系统怎么用?HR 高效识人实操指南
  • 构建个性化AI助手:LobeChat会话管理功能深度使用技巧
  • 基于昇腾NPU的YOLOV8-seg c++部署
  • 26、深入探索脚本编程与系统安全基础
  • XSS漏洞有哪几种?DOM型XSS和反射型有什么区别?SQL注入原理又是什么?网安面试题常见问题一文详解
  • 压力扫描阀:并行校准技术,解锁多点压力测量新高度
  • PyTorch框架下运行Qwen3-32B的内存优化策略
  • 为什么说Qwen3-8B是学术研究的理想选择?实测报告出炉
  • java基础-PriorityQueue(优先队列)
  • Qwen3-14B模型量化压缩技术:降低GPU内存占用
  • 18、日期和时间的格式化、解析及时间区域的使用