插入排序——折半插入排序

1、简述:

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

实现步骤:

  • 定义:已知列表arr,从第二个元素开始,i=1,arr[temp] = arr[i], arr[low] 表示首元素,arr[high]表示末元素,中间值arr[mid] = arr[ (low+high)/2];
  • 比较temp和mid 的元素大小,
    • 当temp < mid,则选择low到mid-1的位置作为新插入区域,即[low, high=mid-1];
    • 否则,选择mid+1到high的位置作为新插入区域,即[low=mid+1, high];
    • 循环直到low<=high不成立
  • 移动元素:将[low, i)位置的元素向后移动,把temp的元素插到low的位置。

2、复杂度

时间复杂度:O(n²)(比直接插入算法明显减少了关键字之间比较的次数,因此速度比直接插入排序算法快,但记录移动的次数没有变)

空间复杂度:O(1)

3、稳定性:稳定排序

4、例子

C++代码: 

#include <iostream>
using namespace std;#define LEN 8 // 有LEN个元素要排void BInsertSort(int arr[], int length)
{for(int i = 1; i < length; i++){int temp = arr[i];int low = 0;int high = i - 1;while(low <= high){  // 在arr[low..high]中折半查找有序插入的位置int mid = (low + high) / 2;   // 折半if(temp < arr[mid]){ // 关键字相同时,使low = m + 1,到高半区,保证稳定性high = mid - 1; // 插入点在低半区}else{low = mid + 1; // 插入点在高半区}}for(int j = i; j >= low + 1; j--){arr[j] = arr[j - 1];}arr[low] = temp;cout<<"i="<<i<<"的排序结果:";for (int a = 0;a < length;a++) {cout << arr[a] << " ";}cout<<endl;}
}
int main(void)
{int arr[LEN] = {45, 98, 66, 90, 88, 78, 25, 45};BInsertSort(arr, 8);return 0;
}

输出结果:

i=1的排序结果:45 98 66 90 88 78 25 45 
i=2的排序结果:45 66 98 90 88 78 25 45 
i=3的排序结果:45 66 90 98 88 78 25 45 
i=4的排序结果:45 66 88 90 98 78 25 45 
i=5的排序结果:45 66 78 88 90 98 25 45 
i=6的排序结果:25 45 66 78 88 90 98 45 
i=7的排序结果:25 45 45 66 78 88 90 98 

 参考:折半插入排序_百度百科

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目部署阿里云服务器详细流程

1.购买域名 官网 域名的作用的是为了DNS解析&#xff0c;这样被人访问的不再是一连串的IP地址&#xff0c;而是形如 www.xxx.com 这样的网站 域名购买流程较长&#xff0c;还需备案&#xff0c;所以能提前准备好&#xff0c;10块左右买个.top域名

Python—KNN分类算法

原文: https://zhuanlan.zhihu.com/p/143092725 1. 概述 KNN 可以说是最简单的分类算法之一&#xff0c;同时&#xff0c;它也是最常用的分类算法之一。注意&#xff1a;KNN 算法是有监督学习中的分类算法&#xff0c;它看起来和另一个机器学习算法 K-means 有点像&#xff0…

百安居的数字化之路:找到用户的“连接器”

从线下客流遭遇悬崖式下跌到逐步回升&#xff0c;越来越多企业认识到&#xff0c;用户消费习惯的改变已经不可逆地影响着各行各业&#xff0c;只有让组织、人员、系统、产品等元素产生新的连接和协同&#xff0c;才能不断强化企业对抗风险的能力。这个过程&#xff0c;也是数字…

改进的A*算法的路径规划(3)

5.4实验结果与讨论 为验证本文算法的有效性&#xff0c;在模拟越野环境中完成路径规划&#xff0c;并通过仿真对比 实验验证了本文改进算法的可行性和综合性能的优越性。 5.4.1 与 传 统A*实验对比 为了验证改进A* 算法与传统A* 的优越性&#xff0c;建立了7050的栅格地图(并…

如何制作AI数字人高清模型?

数字人是什么&#xff1f;重新下一个定义&#xff1a;"把人数字化&#xff0c;以行人的职责“它是用AI技术根据你的真人形象克隆出一个数字人&#xff0c;跟真人的相似度可以达到100%以上的&#xff0c;像你的动作、表情还有声音&#xff0c;都是可以被克隆出来。克隆出来…

SpringBoot程序打包失败处理

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

最新鸿蒙HarmonyOS4.0开发登陆的界面2

登陆功能 代码如下&#xff1a; import router from ohos.router; Entry Component struct Index {State message: string XXAPP登陆State userName: string ;State password: string ;build() {Row() {Column({space:50}) {Image($r(app.media.icon)).width(200).interpol…

josef约瑟 静态电压继电器 HWY-41B 19-240V 导轨式安装

HWY-40系列无辅源静态电压继电器 HWY-41A无辅源静态电压继电器 HWY-42A无辅源静态电压继电器 HWY-43A无辅源静态电压继电器 HWY-44A无辅源静态电压继电器 HWY-45A无辅源静态电压继电器 HWY-41B无辅源静态电压继电器 HWY-42B无辅源静态电压继电器 HWY-43B无辅源静态电压继电器 …

Qt之QSlider和QProgressBar

Qt之QSlider和QProgressBar 实验结果 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);connect(ui->dial,&QDial::valueChanged,this,&Widget::do_val…

腾讯云:AI云探索之路

随着科技的飞速发展&#xff0c;人工智能(AI)云计算领域日益显现出其巨大的潜力和价值。在这个充满挑战和机遇的领域&#xff0c;腾讯云凭借其卓越的技术和创新能力&#xff0c;取得了令人瞩目的成果。本文将深入探讨腾讯云在AI云计算领域的优势&#xff0c;以及其为人工智能发…

【概率方法】MCMC 之 Gibbs 采样

上一篇文章讲到&#xff0c;MCMC 中的 HM 算法&#xff0c;它可以解决拒绝采样效率低的问题&#xff0c;但是实际上&#xff0c;当维度高的时候 HM 算法还是在同时处理多个维度&#xff0c;以两个变量 x [ x , y ] \mathbf{x} [x,y] x[x,y] 来说&#xff0c;也就是同时从联合…

值类型相关函数与对象类型相关函数内存调用过程

值类型相关函数内存调用&#xff1a; 先来看这样一段代码&#xff0c;你认为它的运行结果是多少呢&#xff1f; 20和11还是20和10&#xff1f; package org.example;public class Main {public static void main(String[] args) {int a10;add(a);System.out.println(a);}pub…

js Array.every()的使用

2023.12.13今天我学习了如何使用Array.every()的使用&#xff0c;这个方法是用于检测数组中所有存在的元素。 比如我们需要判断这个数组里面的全部元素是否都包含张三&#xff0c;可以这样写&#xff1a; let demo [{id: 1, name: 张三}, {id: 2, name: 张三五}, {id: 3, name…

一文读懂持续集成和持续部署的差异?

持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;是现代软件开发中的关键实践。虽然它们经常被同时提到并具有共同的目标&#xff0c;但它们的方法、目的和对开发周期的影响是不同的。对于任何寻求根据特定项目需求优化工作流程的开发团队来说&#xf…

我的隐私计算学习——隐私集合求交(2)

笔记内容来自多本书籍、学术资料、白皮书及ChatGPT等工具&#xff0c;经由自己阅读后整理而成。 前篇可见&#xff1a;我的隐私计算学习——隐私集合求交&#xff08;1&#xff09; &#xff08;三&#xff09;PSI应用场景问题 ​在目前的实际应用中&#xff0c;衍生出一些新…

[MySQL]事务原理之redo log,undo log

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、log日志文件 &#x1f4d5; 事务执行流程 &#x1f4d5; redo log &#x1f4d5; undo log 二、总结 &#x1f440;再来一遍ACID 1. 原子性&#xff1a;原子性确保事务作为一个整体执行&#xff0c;要么…

Linux操作系统学习(零)、计算机概论

计算机概论 指令集 CPU中含有多种指令集&#xff0c;指令集对于CPU运算具有指导和优化的硬程序&#xff0c;用来引导CPU进行加减运算和控制计算机操作系统的一系列指令的集合 常见的就有微指令集RISC和复杂指令集CISC RISC&#xff1a;包括ARM架构和PPC架构 CISC&#xff…

Nginx【通俗易懂】《中篇》

目录 1.Url重写rewrite 2.防盗链 3.静态资源压缩 4.跨域问题 1.Url重写rewrite &#x1f929;&#x1f929;&#x1f929; 1.1.rewrite书写格式 rewrite是实现URL重写的关键指令&#xff0c;根据regex&#xff08;正则表达式&#xff09;部分内容&#xff0c;重定向到rep…

物联网与低代码:构建智能化的连接世界

物联网&#xff08;IoT&#xff09;是指通过互联网将各种物理设备、传感器、车辆等连接起来&#xff0c;从而实现数据交互和智能化控制的技术领域。而低代码开发平台则是一种快速构建应用程序的方法&#xff0c;通过简化开发过程&#xff0c;使开发人员能够更迅速地实现创意和创…

猫粮哪个牌子质量好性价比高?十大质量好主食冻干猫粮牌子推荐

近年来&#xff0c;冻干猫粮作为备受追捧的高品质猫粮&#xff0c;吸引了越来越多养猫人的关注。新手养猫就弄不明白了&#xff0c;什么是冻干猫粮呢&#xff1f;冻干猫粮可以作为日常主食一直喂吗&#xff1f; 像我这种养猫老司机早就开始了冻干喂养。我把我这些年总结的经验…