news 2026/4/3 6:29:08

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

作者头像

张小明

前端开发工程师

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/3/31 3:29:13

吐血整理,性能测试-性能常遇问题分析原因+解决(超细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、常见的性能问题…

作者头像 李华
网站建设 2026/4/1 21:15:56

GitPuk基础到实践,分支管理全攻略

GitPuk是一款开源免费的代码管理工具&#xff0c;在上一篇已经介绍了如何进行代码管理&#xff0c;这篇文章将介绍如何进行分支管理。1、分支管理1.1 创建分支进入git仓库点击分支右上角的新建分支输入名称选择分支来源即可。1.2 切换分支进入仓库设置选择分支设置即可1.3 查询…

作者头像 李华
网站建设 2026/4/2 0:17:31

Hadess基础到实践,如何详细管理Generic制品

Hadess是一款开源免费的制品管理工具&#xff0c;在上一篇中已经介绍了Docker制品详细使用过程&#xff0c;这篇文章将介绍在Hadess中详细的使用Generic制品。1、创建Generic制品库1.1 Generic本地库打开创建本地库界面&#xff1a;点击新建制品库选择新建本地库添加信息点击确…

作者头像 李华
网站建设 2026/3/13 17:35:38

Django基于大数据的健康美食推荐系统

Django基于大数据的健康美食推荐系统是一个结合了大数据技术和Django框架的健康饮食推荐平台。以下是对该系统的详细介绍&#xff1a; 一、系统背景与意义 在现代社会&#xff0c;随着健康意识的提高和人们对个性化健康管理的需求不断增长&#xff0c;基于大数据的健康美食推荐…

作者头像 李华
网站建设 2026/4/2 2:17:11

从需求到上线:基于 Spring AI 打造“AI 问数”Agent 的完整实践

导读&#xff1a; 传统 BI 报表难以及时响应灵活多变的运营需求&#xff0c;而 Text-to-SQL&#xff08;文本转SQL&#xff09; 技术正是打破这一数据壁垒的关键。 本文将深度复盘 佳杰云星技术团队 如何基于 Java 生态&#xff08;Spring AI Alibaba&#xff09;&#xff0c;从…

作者头像 李华