折半插入排序算法

2023-05-16

  折半插入排序(Binary Insertion Sort)是对插入排序算法的一种改进。所谓插入排序,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。

  具体操作: 在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high]。将待插入元素与a[mid](其中mid=low+(high-low)/2)相比较,如果比参考元素小,则选择a[low]到a[mid-1]为新的插入区域(即high=mid-1),否则选择a[mid+1]到a[high]为新的插入区域(即low=mid+1),如此直至low<=high不成立,即将high+1位置及之后所有元素后移一位,并将新元素插入a[high+1]。

  例如: 使用折半插入排序算法将数组 { 4,2,8,0,5,7,1,3,6,9 } 进行升序排序。

在这里插入图片描述
  实现代码如下所示。

#include<iostream>
using namespace std;

template<class T>
void BinaryInsertionSort(T *a, int n)
{
	int i, j, low, high, mid;
	for (i = 2; i < n; i++)  //依次将a[2]~a[n]插入到前面已经排好序的列表
	{
		a[0] = a[i];  //将a[i]暂存到a[0]
		low = 1;
		high = i - 1;
		while (low <= high)
		{
			mid = low + (high - low) / 2;  //取中间位置(利用low + (high - low) / 2求mid是为了防止整数溢出问题)
			if (a[mid] > a[0])  //查找左子表
			{
				high = mid - 1;
			}
			else  //查找右子表
			{
				low = mid + 1;
			}
		}
		for (j = i - 1; j >= high + 1; --j)  //i - 1指待插入元素的前一个元素,即有序列表中所有大于待插入元素的最后一个元素;high + 1指有序列表中所有大于待插入元素的第一个元素
		{
			a[j + 1] = a[j];  //统一后移元素
		}
		a[high + 1] = a[0];  //插入操作
	}
}

int main()
{
	int a[] = { 0,4,2,8,0,5,7,1,3,6,9 };

	cout << "排序前:" << endl;
	for (int i = 1; i < 11; i++)
	{
		cout << a[i] << "  ";
	}
	cout << endl;

	BinaryInsertionSort(a, 11);

	cout << "排序后:" << endl;
	for (int i = 1; i < 11; i++)
	{
		cout << a[i] << "  ";
	}
	cout << endl;

	double b[] = { 0,4.1,2.2,8.3,0.4,5.5,7.6,1.7,3.8,6.9,9.0 };

	cout << "排序前:" << endl;
	for (int i = 1; i < 11; i++)
	{
		cout << b[i] << "  ";
	}
	cout << endl;

	BinaryInsertionSort(b, 11);

	cout << "排序后:" << endl;
	for (int i = 1; i < 11; i++)
	{
		cout << b[i] << "  ";
	}
	cout << endl;

	system("pause");

	return 0;
}

排序前:
4 2 8 0 5 7 1 3 6 9
排序后:
0 1 2 3 4 5 6 7 8 9
排序前:
4.1 2.2 8.3 0.4 5.5 7.6 1.7 3.8 6.9 9
排序后:
0.4 1.7 2.2 3.8 4.1 5.5 6.9 7.6 8.3 9

  需要注意的是,在上述代码中,为防止整数溢出问题的出现,在求中间的下标mid时,使用mid = low + (high - low) / 2;,而不是mid = (high + low) / 2,详细原因见→为防止整数溢出问题,使用low + (high - low) / 2而不是(high + low) / 2。

  原始数组的第一轮排序代码运行的中间过程如下图所示。

在这里插入图片描述
  时间复杂度: 折半插入排序算法比直接插入排序算法明显减少了关键字之间比较的次数,因此速度比直接插入排序算法快,但记录移动的次数没有变,所以折半插入排序算法的时间复杂度仍然为 O ( n 2 ) O(n^2) O(n2),与直接插入排序算法相同。

  稳定性: 由于在比较的时候,对于两个相等的元素,不会进行移动,排序完成后,相同元素之间的先后顺序不变,所以折半插入排序算法是一种稳定的排序算法,如下图所示。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

折半插入排序算法 的相关文章

  • Python游戏项目--外星人入侵(一)

    一 安装Pygame 在终端输入 xff1a pip install user pygame 二 开始游戏项目 xff08 1 xff09 创建Pygame窗口及响应用户输入 创建一个名为alien invasion py 的文件 xff0
  • SpringSecurity OAuth2 获取Token端点TokenEndpoint、Token授权TokenGranter接口 详解

    1 前言 在 授权服务器是如何实现授权的呢 xff1f 中 xff0c 我们可以了解到服务端实现授权的流程 xff0c 同时知道 xff0c 当授权端点AuthorizationEndpoint生成授权码时 xff0c 就会重定向到客户端的
  • Make文件中赋值等号的几种类型(:=,?=,=)

    今天有一位以前仅做过Android APP开发的同学突然间问我 xff0c 说Makefile中经常可以看见 xff1a 冒号等号 61 问号等号 61 和直接等号 61 这究竟有什么区别呢 xff1f 欢迎转载 xff0c 但是请注明原出
  • 支持nvidia GPU 的硬件编解码的ffmpeg编译记要

    支持nvidia GPU 的硬件编解码的ffmpeg编译记要 中间目录 xff1a out 1 x264 下载x264 stable zip unzip x264 stable zip cd x264 stable configure en
  • 软件工程学习笔记——第三周:结构化分析方法-1

    结构化分析方法的概念 结构化分析模型 结构化分析过程
  • GBK编码表

    说明 xff1a 比如第一个 34 顿号 34 的编码就是A1A2 GBK 汉字内码扩展规范 编码表 二 全国信息技术标准化技术委员会 汉字内码扩展规范 GBK Chinese Internal Code Specification 1 0
  • SSH 使用过程中,出现的问题以及解决办法

    1 ssh登陆提示 server unexpectedly closed network connection 在使用ssh登入Linux時 xff0c 卻發生了serverunexpectedly closed network conne
  • CentOS7安装vncserver

    1 关闭防火墙和selinux systemctl stop firewalld service setenforce 0 2 安装图形支持 yum groups install 34 GNOME Desktop 34 或yum group
  • Echarts tooltip加上单位并带着图例颜色

    模仿腾讯疫情地图 xff0c Y轴有个百分比 xff0c 也就是Y轴有单位 xff0c 使用JS代码如下 xff1a tooltip trigger 39 axis 39 formatter function params var relV
  • xv6调试

    窗口1作为xv6的运行窗口 make CPUS 61 1 qemu gdb 窗口2作为gdb调试窗口 gdb multiarch kernel kernel 进入gdb后执行 set confirm off set architecture
  • mit6.s081-21-Lab1/ Xv6 and Unix utilities

    sleep Implement the UNIX program sleep for xv6 your sleep should pause for a user specified number of ticks A tick is a
  • Python+scrcpy+pyminitouch实现自动化(四)——实现语音识别自动打卡机器人

    首先要去网上下载一个想要实现自动化的软件 xff0c 下载对应的apk后拖拉到虚拟器的页面即可实现自动下载 以上是对于AS打开的模拟器进行的下载安装 xff0c 由于我找不到关于x86的企业微信 xff0c 所以我就换了逍遥模拟器 xff0
  • CMU15445 lab1 - BUFFER POOL

    本文为本人完成15445 2020fall B 43 树版本 时的一些记录 xff0c 仅作为备忘录使用 TASK 1 LRU REPLACEMENT POLICY 本任务为实现一个LRU页面置换策略 xff0c 建立一个关于面向磁盘的数据
  • 医院信息管理系统(Python与MySQL数据库的连接与相关增删改查操作)

    题目意义 医院信息管理是一项琐碎 复杂而又十分细致的工作 xff0c 这关系到医院体系能否运行起来这一关乎国民健康水平的重大问题 我们只有利用好了医院中每个医生 护士的各项资源 xff0c 才能使得医院系统能够有序而条理的进行 xff0c
  • 慢速协议-Slow Protocol-LACP

    慢速协议有三种 xff0c 包括802 3ah OAM LACP协议和Marker协议 慢速协议的特点 xff1a 1 xff0c 每秒钟传输的报文不超过10帧 xff1b 2 xff0c 报文不携带vlan tag xff1b 3 xff
  • fork() && fork() || fork()

    include lt unistd h gt include lt stdio h gt int main fork fork amp amp fork fork fork sleep 100 return 0 问题是不算main这个进程自
  • list_entry()详解

    Linux内核中 xff0c 获取节点地址的函数list entry 非常常用 xff0c 由于其定义有点晦涩 xff0c 先解析如下 xff1a list entry的宏定义 xff1a define list entry ptr typ
  • Linux 内核 hlist 详解

    在Linux内核中 xff0c hlist xff08 哈希链表 xff09 使用非常广泛 本文将对其数据结构和核心函数进行分析 和hlist相关的数据结构有两个 xff1a hlist head 和 hlist node hash桶的头结
  • 判断手机号码合法性

    问题描述 xff1a 我国大陆运营商的手机号码标准格式为 xff1a 国家码 43 手机号码 xff0c 例如 xff1a 8613912345678 特点如下 xff1a 1 长度13位 xff1b 2 以86的国家码打头 xff1b 3

随机推荐

  • linux c捕获信号

    linux c捕获信号 在程序中为了实现优雅退出 xff0c 需要对信号进行处理 xff0c 本文主要记录一下两个方面 xff1a 如何捕获SIGINT SIGTERM SIGQUIT等信号 xff0c 并进行处理 如何知道是哪个进程给自己
  • go语言获取发送信号的进程pid

    背景 今天在发布一个程序之前 xff0c 给qa提测的时候 xff0c qa反馈程序运行10几分钟之后 xff0c 退出了 排查过程 在程序中加日志 xff0c 发现程序捕获到了一个SIGTERM信号 xff0c 然后做了一些退出前的清理工
  • ubuntu-E:Encountered a section with no Package: header的解决办法

    刚才打开ubuntu xff0c 我的版本是12 04 正想使用sudo apt get install build essential 时 xff0c 出现了如下错误 xff1a E Encountered a section with
  • scrcpy源码阅读及在Ubuntu上的实现(一)——了解原理

    那开篇就问问为什么需要研究这个源码吧 xff1a 在移动互联网的时代下 xff0c 手机的功能是日益增加的 xff0c 要使工作变得更加的高效 xff0c 那么键盘鼠标其实是必不可少的 在许多软件的架构中 xff0c 其实并没有提供对应的桌
  • 文件或目录损坏且无法读取的解决办法

    方法很简单 用 chkdsk 命令即可 详解如下 开始 运行 输入 cmd 输入 chkdsk 盘符 f 等命令运行完即可 这里要注意的是 那个冒号后面要空一格 别跟着就写 34 f 34
  • Linux技巧-如何查看系统信息-硬盘、分区信息以及磁盘用量

    使用 hdparm 获得硬盘的生产厂家 xff0c 类型等基本信息 xff0c 这里我们之提供简单的使用 xff0c 以后 hdparm i dev sda 通过 smartctl命令来获取硬盘的详细信息 xff1a smartctl a
  • 朋友答App技术服务支持

    朋友答App有任何使用问题 xff0c 欢迎留言交流
  • Matlab调用Cuda程序

    目录 一 环境配置 1 GPU 43 VisualStudio 43 Matlab版本适配性查看 2 Matlab环境配置 二 使用Matlab编译CUDA工程 1 建立CUDA工程并编写GPU代码 2 编写可供Matlab编译的CUDA代
  • python函数参数*args**kwargs用法实例

    http www jb51 net article 44104 htm python当函数的参数不确定时 xff0c 可以使用 args和 kwargs args没有key值 xff0c kwargs有key值 下面看例子 复制代码 代码如
  • 简易图解移轴镜头 (Tilt-Shift Lens) 原理 简易图解移轴镜头 (Tilt-Shift Lens) 原理

    http fotomen cn 2012 10 tilt shift lens 移轴镜 Tilt Shift Lens 是颇昂贵的玩意 xff0c 例如 Canon 的 TS E 24mm f 3 5L II xff0c 官方零售价是 HK
  • GTA5最新线上小助手

    https wwr lanzoui com ivR9Wsuixmb 密码 4ug1
  • DELL-R730服务器U盘安装操作系统指南

    一 系统安装注意事项 xff1a 1 DELL服务器安装系统 xff0c 根据实际情况先做raid5 xff0c 因为我们有3块硬盘 xff1b 2 安装系统前先把U盘做成启动盘 xff0c 然后下载相应的阵列卡驱动 xff0c 阵列卡驱动
  • VCS2018 linux 安装

    VCS linux 安装 自己去网上找2018版本的vcs 和verdi xff0c 就不贴出来了 xff0c 这里把安装过程中遇到的一些问题留作记录 声明 xff1a 只做学术研究 xff0c 不做商业用途 xff0c 公司使用推荐购买正
  • Ubuntu mate 20.04及无vnc的Ubuntu 系统开启vnc

    Ubuntu mate 20 04及无vnc的Ubuntu 系统开启vnc 目录 Ubuntu mate 20 04及无vnc的Ubuntu 系统开启vnc1 介绍2 步骤 1 介绍 2 步骤 1 介绍 我学习ros机器人的过程中 xff0
  • OpenCV入门(四)——边缘检测

    目录 0x01 梯度算子 0x02 一阶微分算子 0x03 二阶微分算子 0x04 图像差分运算 0x05 非极大值抑制 0x06 基本边缘算子 Sobel 0x07 基本边缘算子 Laplace 0x08 基本边缘检测算子 Roberts
  • python教程:9种元组常用操作方法

    基础知识 xff5e 总之多记多看就对了 一 元组定义 元组不可变 xff0c 当我们需要创建一组不可改变的数据时 xff0c 通常是将这些数据放进元组中 tu 61 1 2 3 39 a 39 39 b 39 39 c 39 小括号定义元
  • 3D打印Gcode命令指令简析

    G0 xff1a 快速移动 G1 xff1a 控制移动 坐标轴XYZE移动控制 xff08 G0和G1一样 xff09 例子 xff1a G0 F2000 X30 Y30 Z30 E3 G2 xff1a 顺时针画弧 G3 xff1a 逆时针
  • 数学建模(一)—— 人口增长模型的确定

    一 题目要求二 相关的基础知识2 1 马尔萨斯 Malthus 人口指数增长模型2 2 逻辑斯蒂 Logistic 增长模型2 3 改进的Logistic模型2 4 BP神经网络模型 三 模型的建立与求解3 1 Malthus模型3 2 L
  • 将火狐浏览器视频播放倍速设置为3倍速及其以上

    看视频最快只能两倍速 xff1f 使用火狐浏览器看视频时将视频播放倍速提升到最快16倍速的方法来了 xff01 xff01 xff01 step1 xff1a 打开火狐浏览器页面左上角的应用程序菜单 xff0c 点击扩展和主题 xff1b
  • 折半插入排序算法

    折半插入排序 xff08 Binary Insertion Sort xff09 是对插入排序算法的一种改进 所谓插入排序 xff0c 就是不断的依次将元素插入前面已排好序的序列中 由于前半部分为已排好序的数列 xff0c 这样我们不用按顺