二分插入排序(c语言)
一、什么是二分插入排序?
二分法插入排序,简称二分排序,是在插入第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语言)相关推荐
- C语言排序方法-----二分插入排序
由于在直接插入排序过程中,待插入数据左边的序列总是有序的,针对有序序列,就可以用二分法去插入数据了,也就是二分入排序法.适用于数据量比较大的情况. 二分插入排序的算法思想是: (1)计算 0 ~ i- ...
- 我的Java开发学习之旅------Java经典排序算法之二分插入排序
一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较, ...
- 向Array中添加二分插入排序
二分插入排序思路 先在有序区通过二分查找的方法找到移动元素的起始位置,然后通过这个起始位置将后面所有的元素后移. 二分插入排序实现 Function.prototype.method = functi ...
- python插入排序_python简单的实现插入排序和二分插入排序
零:环境 Python 3.6.5 JetBrains PyCharm 2018.1.4 x64 一:正常的插入排序 插入排序如字面意思,是将数据一个一个的插入到列表里以形成有序数列 插入排序的前提是 ...
- 深入理解插入排序(why二分插入排序中left就是待插入位置)
>> 插入排序 本编重点在最后: 为什么二分插入left总是指向待插入的位置? 插入排序的思路: 给定一个数组,将数组划分为,已排序和未排序两部分,默认第一个元素已排序,然后一次遍历未排序 ...
- 二分插入排序法-Python版
简介: 传统的插入法思想为: 1.从头开始,构建有序数列: 2.再将之后需要排序的数据从头至尾(或从尾至头)进行比较,插入到其相应的位置. 而二分插入排序法第一步与传统插入法相同,第二步而是采用二分查 ...
- 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序
简单排序算法时间空间复杂度分析及应用(4)-二分插入排序 背景: 顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直 ...
- java二分排序法原理_Java常见排序算法详解—— 二分插入排序
转载请注明出处: 二分插入排序Binary Insert Sort 概念: 二分(折半)插入排序是一种在直接插入排序算法上进行小改动的排序算法.其与直接排序算法最大的区别在于查找插入位置时使用的是二分 ...
- (六)Java算法:二分插入排序
目录 一.前言 二.maven依赖 三.实现 3.1.详解版 3.2.日志精简版 结语 一.前言 插入排序常见的有两种:直接插入排序 和 二分插入排序,我们上一篇算法已经讲过了直接插入排序,现在我 ...
- 常见排序算法之二分插入排序算法
1.算法思路 是在插入第i个元素时(i前面的元素必定是有序的),对前面的0-i-1元素进行折半,先跟他们中间的那个元素比, 如果小,则对前半再进行折半,否则对后半进行折半, 直到left>rig ...
最新文章
- mysql cluster cge (commercial)_Mysql 产品分类和版本说明
- eval在python中是什么意思_如何在Python中使用eval ?
- mysql 查询正在执行的事务以及锁 常用的sql语句
- linux 网络服务器 源码下载,linux下 各类tcp网络服务器的实现源代码.doc
- SSM 框架整合 spring 发送邮件功能实现!
- Java中的对象、private关键字、this关键字、构造方法
- python读取yaml文件
- “你在哪里上班?”“呵呵呵!”
- oracle11 刚刚安装后提示invalid username password logon denied
- (原創) 如何控制DE2 VGA輸出時某座標的顏色? (IC Design) (DE2) (Quartus II)
- 算法笔记:Dinic最大流和SPFA费用流
- VGA线材说明与鉴别详解
- python共享单车数据分析_共享单车数据可视化分析(Python/Seaborn)
- 自然语言处理相关:英文词性缩写一览表
- windows电脑防火墙关闭,一键系统防火墙关闭工具推荐
- 聊下git merge --squash
- 计算机音乐外国,趣闻,国内外大神教你,用计算器圆你的音乐梦
- @所有人,官网下载的微信小程序开发工具安装后黑屏咋办?
- 【更新】Aspose.Cells 10月新版V17.10发布 | 支持读写外部XLSB文件
- 关于eml 解析的学习