news 2026/6/17 16:05:06

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

作者头像

张小明

前端开发工程师

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/17 20:41:43

攻防世界——BadProgrammer

拿到靶机首先抓包观察用的是什么服务器和框架发现服务器是Nginx&#xff0c;框架是PHP的express框架再用dirsearch扫一遍发现扫出了/static../意味着服务器存在配置错误&#xff0c;导致了目录遍历漏洞。当服务器配置不当时&#xff0c;特别是处理静态文件路径时&#xff0c;攻…

作者头像 李华
网站建设 2026/6/17 14:16:21

AI 搜索时代新战场:智汇GEO 如何重构品牌 AI 形象管理规则

AI 搜索已成为商业决策与消费选择的重要参考场景&#xff0c;品牌在 AI 生成结果中的能见度、信息准确性直接影响市场信任度与商业转化。当 AI 答案的话语权持续提升&#xff0c;品牌传统形象管理模式已难以应对动态变化的 AI 生态&#xff0c;而新榜智汇的出现&#xff0c;正为…

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

小红书Java面试被问:java创建对象有哪些方式?

在Java中&#xff0c;创建对象主要有以下五种核心方式&#xff0c;每种方式都有其适用场景&#xff1a; 1. 使用 new 关键字&#xff08;最常用&#xff09; java // 调用构造方法 Person person new Person(); 特点&#xff1a;直接调用类的构造器&#xff0c;触发类加载&a…

作者头像 李华
网站建设 2026/6/18 0:15:14

2025年AI品牌舆情监听:9款核心工具评估与选择指南

什么是大型语言模型监控工具&#xff1f; LLM监控工具追踪您的品牌在ChatGPT、Claude和谷歌AI概览等平台生成的AI响应中的表现。 当潜在客户向人工智能询问你所在行业的产品或服务时&#xff0c;你需要知道你的品牌是否被提及。以及你与竞争对手的比较。 这些监控LLM可见度的工…

作者头像 李华
网站建设 2026/6/17 9:17:36

B2B内容营销终极指南:基于数据的有效策略、无效陷阱与可忽略的噪音

什么是B2B内容营销&#xff1f; B2B内容营销是通过高质量内容量身定制&#xff0c;教育、影响并转化企业买家的方式。 这不是为了提高曝光率或通过社交媒体帖子追逐点击。这或许能吸引注意力&#xff0c;但很少能推动行动。 B2B买家不会草率做出决策。他们会让团队成员介入&…

作者头像 李华
网站建设 2026/6/17 19:21:40

程序员搞钱新赛道:大模型开发全栈教程,小白也能30天速成!

Part.1 AI工程师都要会些什么&#xff1f; 大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;技术的兴起&#xff0c;正在深刻影响软件的形态&#xff0c;开发者的工作也从实现业务逻辑、构建独立应用&#xff0c;转向以LLM为底层引擎快速搭建智能应用的…

作者头像 李华