一、什么是二分插入排序?

二分法插入排序,简称二分排序,是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left<right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上。(出自百度搜素)。

二、二分查找

想要彻底弄明白二分插入排序,就首先要知道什么是二分查找法。

首先我们先来说说什么是二分查找法,说白了就是折中查找。什么是折中查找呢?

如图:

折中查找就是在一个数组查找到一个元素的位置(记住所查找的元素必须是一个升序的数组)。

图中第一步定义的min 和 max 分别对应的是下标最小值和小标最大值,num所对应的是min+max的折中取整值。

第二步拿所要查找的元素与数组中下标为num的元素进行大小比较。当查找元素 > a[num]时,那么min = num + 1,为什么min的值会变成num + 1?因为通过比较可知查找元素是在a[num]元素的右边,所以min就要更新为num + 1,且max值不变。当查找元素 < a[num]时,max 的变化原理与min值变化原理相同。当查找元素 == a[num]时,就说明你所要查找的元素已经找到,可以将其打印出来,并停止循环。

通过while循环第二步,其中num的值需要放在循环中,循环停止条件是在min > max时停止循环。

第三步当循环停止时,且min > max时,就说明在数组中是找不到你要查找的数字。

while(min <= max){int num1 = (min+max) / 2;if(num < i[num1]){max = num1-1;     }else if(num > i[num1]){min = num1+1;}else{printf("%d\n",i[num1]);break;}}if(min > max){printf("查询不到这个数\n");}

三、二分插入排序过程

了解完二分查找后,我们就来说说什么是二分插入。想知道二分插入排序,我建议是可以先去了解一下什么是插入排序,两者的区别在于怎样找到插入的位置。

插入排序的插入位置是可以自己设置的,数组中想插入到哪就插入到哪,前提是这个数组要大,对升序降序没有要求。

而二分插入排序的插入位置是通过二分查找找到的,前提是这个数组也要够大,而且这个数组必须是一个升序的数组才能进行二分插入排序。

通过二分查找我们可知当min > max时是说明这个数组中是没有你要查找的数字,而在二分插入排序中当 min > max时,就是找到了插入的位置,插入的位置的下标等于min,且在二分查找的过程中就不需要写 = 的情况了

例:定义一个升序的数组 a[8] = {11,24,35,46,59,67,78}。其中我要向数组插入47。

11,24,35,46,59,67,78

通过改良二分查找,可以得到 最终跳出循环后min = 4,那么47最终插入的位置就为下标 = 4的位置,原先插入位置的元素和后面的元素全部向后移动一位。

所以最终的结果{11,24,35,46,47,59,67,78}

四、代码完整过程

#include <stdio.h>int arr_num_lp(int *p,int n,int m)//查找插入位置
{int min = 0;int max = n - 1;int temp = m;while(min <= max){int num = (min + max) / 2;if(temp < p[num]){max = num - 1;}else{min = num + 1;}}return min;
}void arr_ist_sort(int *p,int n,int m)//元素后移
{int i = 0;for(i = 7;i >= m;i--){p[i] = p[i] ^ p[i + 1];p[i + 1] = p[i] ^ p[i + 1];p[i] = p[i] ^ p[i + 1];}p[m] = n;
}void arr_out(int a[9])//将数组输出
{int i = 0;for(i = 0;i < 9;i++){printf("%d ",a[i]);}printf("\n");
}int main()
{int a[9] = {0};int i = 0;printf("请输入一个递增的数组\n");for(i = 0;i < 8;i++){scanf("%d",&a[i]);}printf("请输入你要插入的数字:\n");int j = 0;scanf("%d",&j);int min = arr_num_lp(a,9,j);//调用查找位置函数arr_ist_sort(a,j,min);//调用位置交换元素arr_out(a);//调用数组输出函数return 0;
}

二分插入排序(c语言)相关推荐

  1. C语言排序方法-----二分插入排序

    由于在直接插入排序过程中,待插入数据左边的序列总是有序的,针对有序序列,就可以用二分法去插入数据了,也就是二分入排序法.适用于数据量比较大的情况. 二分插入排序的算法思想是: (1)计算 0 ~ i- ...

  2. 我的Java开发学习之旅------Java经典排序算法之二分插入排序

    一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较, ...

  3. 向Array中添加二分插入排序

    二分插入排序思路 先在有序区通过二分查找的方法找到移动元素的起始位置,然后通过这个起始位置将后面所有的元素后移. 二分插入排序实现 Function.prototype.method = functi ...

  4. python插入排序_python简单的实现插入排序和二分插入排序

    零:环境 Python 3.6.5 JetBrains PyCharm 2018.1.4 x64 一:正常的插入排序 插入排序如字面意思,是将数据一个一个的插入到列表里以形成有序数列 插入排序的前提是 ...

  5. 深入理解插入排序(why二分插入排序中left就是待插入位置)

    >> 插入排序 本编重点在最后: 为什么二分插入left总是指向待插入的位置? 插入排序的思路: 给定一个数组,将数组划分为,已排序和未排序两部分,默认第一个元素已排序,然后一次遍历未排序 ...

  6. 二分插入排序法-Python版

    简介: 传统的插入法思想为: 1.从头开始,构建有序数列: 2.再将之后需要排序的数据从头至尾(或从尾至头)进行比较,插入到其相应的位置. 而二分插入排序法第一步与传统插入法相同,第二步而是采用二分查 ...

  7. 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序

    简单排序算法时间空间复杂度分析及应用(4)-二分插入排序 背景: 顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直 ...

  8. java二分排序法原理_Java常见排序算法详解—— 二分插入排序

    转载请注明出处: 二分插入排序Binary Insert Sort 概念: 二分(折半)插入排序是一种在直接插入排序算法上进行小改动的排序算法.其与直接排序算法最大的区别在于查找插入位置时使用的是二分 ...

  9. (六)Java算法:二分插入排序

    目录 一.前言 二.maven依赖 三.实现 3.1.详解版 3.2.日志精简版 结语 一.前言   插入排序常见的有两种:直接插入排序 和 二分插入排序,我们上一篇算法已经讲过了直接插入排序,现在我 ...

  10. 常见排序算法之二分插入排序算法

    1.算法思路 是在插入第i个元素时(i前面的元素必定是有序的),对前面的0-i-1元素进行折半,先跟他们中间的那个元素比, 如果小,则对前半再进行折半,否则对后半进行折半, 直到left>rig ...

最新文章

  1. mysql cluster cge (commercial)_Mysql 产品分类和版本说明
  2. eval在python中是什么意思_如何在Python中使用eval ?
  3. mysql 查询正在执行的事务以及锁 常用的sql语句
  4. linux 网络服务器 源码下载,linux下 各类tcp网络服务器的实现源代码.doc
  5. SSM 框架整合 spring 发送邮件功能实现!
  6. Java中的对象、private关键字、this关键字、构造方法
  7. python读取yaml文件
  8. “你在哪里上班?”“呵呵呵!”
  9. oracle11 刚刚安装后提示invalid username password logon denied
  10. (原創) 如何控制DE2 VGA輸出時某座標的顏色? (IC Design) (DE2) (Quartus II)
  11. 算法笔记:Dinic最大流和SPFA费用流
  12. VGA线材说明与鉴别详解
  13. python共享单车数据分析_共享单车数据可视化分析(Python/Seaborn)
  14. 自然语言处理相关:英文词性缩写一览表
  15. windows电脑防火墙关闭,一键系统防火墙关闭工具推荐
  16. 聊下git merge --squash
  17. 计算机音乐外国,趣闻,国内外大神教你,用计算器圆你的音乐梦
  18. @所有人,官网下载的微信小程序开发工具安装后黑屏咋办?
  19. 【更新】Aspose.Cells 10月新版V17.10发布 | 支持读写外部XLSB文件
  20. 关于eml 解析的学习

热门文章

  1. 第一次在CSND做记录,关于linux修改文件的最后访问时间。
  2. L3G400d单独使用实验
  3. 分享一个外泌体数据库
  4. 如何使用EDI系统解决对接多工厂的问题?
  5. 《HTTP权威指南》读书笔记---HTTP概述
  6. 现代通信原理思维导图--第五章 模拟调制系统
  7. 寻找被黑金毁掉的黑客精神
  8. java种语言包在线翻译_Java 实现在线翻译功能 调用微软Bing API
  9. 今日分享idea精彩好看的主题+网站地址
  10. Java基础编程题:倒序输出九九乘法表