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

算法步骤

1、二分法查找插入位置

如果R

2、后移,有点迷惑,什么时候需要后移呢?有哪些记录需要移动呢?

虽然我们很清楚的知道,我们需要后移那些排序码大于R的记录,但难免会问自己这样几个问题。其实它相当于需要移动从i-1到左指针的记录。

3、插入

由1中得到的左指针其实就是元素要插入的位置。

动图演示

image

#include

#include

#include

#include

#include

//交换数值

void swap(int *a,int *b)

{

int temp = *a;

*a = *b;

*b = temp;

}

//打印数组

void printArray(char msg[],int arr[],int len){

printf("%s:",msg);

for (int i = 0; i < len; i++){

printf("%d ", arr[i]);

}

printf("\n");

}

//二分法插入排序

void binary_insert(int a[],int len){

for(int i=1;i<=len-1;i++){

int left=0;

int right=i-1;

int temp=a[i];

//如果a[i]比最大值还大或者相等,则不交换位置,跳过二分查找

if(temp>=a[right]){

continue;

}

//left>right时循环终止

while(left<=right){

//折半

int mid=(left+right)/2;

if(temp

right=mid-1;

}else{

left=mid+1;

}

}

printf("要插入的数据:a[%d]=%d\n",i,temp);

printArray("插入数据前",a,len);

//大于等于left的位置后移一位

for(int j=i-1;j>=left;j--){

a[j+1]=a[j];

}

a[left]=temp;

printArray("插入数据后",a,len);

printf("\n");

}

}

int main()

{

int len=10;

int arr[len];

srand((unsigned)time(NULL));

//随机生成长度为"len"的数组

for(int i=0;i

arr[i]=rand()%200;

}

printArray("未排序前",arr,len);

binary_insert(arr,len);

printArray("二分法插入排序",arr,len);

//防止windows下控制台窗口闪退

int s;

scanf("%d",&s);

return 0;

}

运行结果:

未排序前:96 109 174 33 132 196 181 52 68 57

要插入的数据:a[3]=33

插入数据前:96 109 174 33 132 196 181 52 68 57

插入数据后:33 96 109 174 132 196 181 52 68 57

要插入的数据:a[4]=132

插入数据前:33 96 109 174 132 196 181 52 68 57

插入数据后:33 96 109 132 174 196 181 52 68 57

要插入的数据:a[6]=181

插入数据前:33 96 109 132 174 196 181 52 68 57

插入数据后:33 96 109 132 174 181 196 52 68 57

要插入的数据:a[7]=52

插入数据前:33 96 109 132 174 181 196 52 68 57

插入数据后:33 52 96 109 132 174 181 196 68 57

要插入的数据:a[8]=68

插入数据前:33 52 96 109 132 174 181 196 68 57

插入数据后:33 52 68 96 109 132 174 181 196 57

要插入的数据:a[9]=57

插入数据前:33 52 68 96 109 132 174 181 196 57

插入数据后:33 52 57 68 96 109 132 174 181 196

二分法插入排序:33 52 57 68 96 109 132 174 181 196

二分法c语言程序排序,二分法插入排序(C语言)相关推荐

  1. 培训c语言程序,编程人员培训手册C语言程序设计基础

    <编程人员培训手册C语言程序设计基础>由会员分享,可在线阅读,更多相关<编程人员培训手册C语言程序设计基础(18页珍藏版)>请在人人文库网上搜索. 1.第2章:C语言程序设计基 ...

  2. 培训c语言程序,编程人员培训手册C语言程序设计基础.PPT

    编程人员培训手册C语言程序设计基础.PPT 第2章C语言程序设计基础,学习的意义,从本章开始我们正式进入C语言程序设计的学习,也许大家会问为什么我们要学习C语言呢 理由1因为C语言流行. 理由2因为C ...

  3. c语言程序的书写格式,C语言程序书写格式辅导

    C语言程序书写格式辅导 C语言具有语句简洁的特点,C语言程序的可读性比较差.因此,为了增强C语言的可读性,正确的书写格式就显得十分重要.同样一个程序采用不同的书写方法.尽管都可以得到相同的结果,有的书 ...

  4. c语言程序表达语句,《C语言程序设计》讲稿.doc

    <C语言程序设计>讲稿 <C语言程序设计>讲稿 目 录 第一讲 C语言概述1 第二讲 C语言程序介绍2 第三讲 算法8 第四讲 数据类型(1)20 第五讲 数据类型(2)21 ...

  5. c语言程序报告样例,C语言个人实习报告定稿(样例3)

    <C语言个人实习报告.doc>由会员分享,可免费在线阅读全文,更多与<C语言个人实习报告[定稿]>相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索. 1 ...

  6. c语言程序报告学分信息管理,C语言程序报告学生学籍信息管理系统(总21页

    <C语言程序报告学生学籍信息管理系统(总21页>由会员分享,可在线阅读,更多相关<C语言程序报告学生学籍信息管理系统(总21页(21页珍藏版)>请在人人文库网上搜索. 1.C语 ...

  7. led c语言程序结设计,《C语言程序设计》学习领域课程标准-LED照明工程设计.doc...

    <C语言程序设计>学习领域课程标准-LED照明工程设计.doc <C语言程序设计>课程标准 课程类别 专业核心课程 开课部门 电子信息工程系 总学时 64 学时 学分 4学分 ...

  8. c语言程序报告学分信息管理,c语言程序报告学生学籍信息管理系统.docx

    文档编制序号:[KKIDT-LLE0828-LLETD298-POI08] 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08] C语言程序报告学生学籍信息管理系统 C语言课程设 ...

  9. c语言程序结果好多0,C语言程序成绩管理系统设计报告.docx

    C语言程序成绩管理系统设计报告 郑州轻工业学院实 训 报 告实训名称: 成 绩 管 理 系 统姓 名: 鲁雪颖 院 (系): 软 件 学 院 专业班级: 软件卓越12-01 学 号: 54121344 ...

最新文章

  1. Java中的“可运行的实现”与“扩展线程”
  2. node-sass安装失败解决方法
  3. SVN中如何去除版本控制器
  4. udev工作流程简图
  5. redis主从配置+哨兵模式
  6. redis java驱动_java中通过配置文件的方式(Jedis驱动)使用Redis
  7. android通知悬浮通知_Android通知直接回覆
  8. 小白如何购买阿里云服务器(2019最详细教程)
  9. wxFormBuilder + wxPython手撸丑陋计算器
  10. Windows 无法卸载IE9怎么办
  11. java继承有哪些_Java中的继承类型有哪些
  12. 浅谈制作BIM模型后期展示视频
  13. python跳转下一页_用Beautifulsoup转到下一页
  14. 几种css炫酷背景欣赏
  15. 机器学习练习 6 - Support Vector Machines(支持向量机)
  16. 解决更新pip后报错 Cannot open pip-script.py
  17. [蓝桥杯2019初赛]外卖店优先级
  18. Js_10_2_滚轮事件
  19. Java中com.jcraft.jsch.JSch讲解
  20. 第一次去江苏丹阳配眼镜注意事项⚠️

热门文章

  1. stm32f103驱动SHT20( I2C )
  2. JS设计模式(原型模式)
  3. 开发日记2021-17、20周
  4. 为了从GitHub上下载点东西,我太难了
  5. 在VS Studio中管理多个cpp文件或项目
  6. ubuntu有线网卡RTL8111/8168/8411安装驱动
  7. python 截取指定mp4片段
  8. 20221120.12
  9. matlab三维矩阵变换,交换维度,交换两行
  10. ip和端口号的正则表达式