排序第三篇 直接插入排序

插入排序的基本思想是: 每次将一个待排序的记录按其关键字的大小插入到前面已排好序的文件中的适当位置, 直到全部记录插入完为止

一 简介

插入排序可分为2类
在这里插入图片描述
本文介绍 直接插入排序
它的基本操作是: 假设待排充序的记录存储在数组 R[1…n] 中, 在排序过程的某一时刻, R被划分成两个子区间, R[1…i-1]R[i…n], 其中前一个为已排序的有序区, 后一个为无序区, 开始时有序区中只含有一个元素 R[1], 无序区为 R[2…n] .

排序过程中,只需要每次从无序区中取出第一个元素, 把它插入到有序区的适当位置, 使之成为新的有序区, 依次这样经过 n − 1 n-1 n1 次插入后, 无序区为空, 有序区中包含了全部 n n n 个元素, 至此排序完毕。

以java为例, 看一个demo.


import java.util.Arrays;

/**
 * 2024.2.19
 * 插入排序
 */
public class InsertSort {


    public static void main(String[] args) {

        Integer[] array_ = new Integer[]{30,45,10,30,50};
        System.out.println("初始顺序\n"+ Arrays.toString(array_));
        insertSort(array_);
        System.out.println("最后顺序\n"+Arrays.toString(array_));
    }

    static void insertSort(Integer[] array){

        for(int i=1; i<array.length; i++){    //第0位 独自作为有序数列, 从1开始, 说明第二部分从第二个元素操作
            if(array[i]<array[i-1]){       // 0~ i-1位为有序,  如果当前值 小于 前面一个值
                int temp = array[i];       //将当前值 赋值给 临时变量
                int j = i-1;
                //从第i-1位向前遍历并移位, 直到找到小于第 i 位值停止
                for(; j>=0 && temp < array[j]; j--) {   //j-- 说明是从后面往回走, 然后找插入位置
                    array[j+1] = array[j];      // 将记录后移一位
                }
                array[j+1] = temp;      // 将基准插入到正确位置
            }
        }
    }
}

程序运行结果:
在这里插入图片描述

直接插入排序

二 原理

直接插入排序算法 有两重循环, 外循环表示要进行 n − 1 n-1 n1趟排序, 内循环表明完成一趟排序所进行的记录间的比较和记录的后移。 在每一趟排序中, 最多可能进行 i 次比较, 移动 i + 1 i + 1 i+1 个记录(后循环前后作两次移动)

所以在最坏的情况下(反序) , 插入排序的关键字之间比较次数和记录移动次数达最大值。

最大比较次数: C m a x = ∑ i = 2 n = ( n + 2 ) ( n − 1 ) 2 C_{max} = \sum_{ i=2}^{n }=\frac{(n+2)(n-1)}{2} Cmax=i=2n=2(n+2)(n1)

最大移动次数: M m a x = ∑ i = 2 n ( i − 1 ) = ( n + 4 ) ( n − 1 ) 2 M_{max} = \sum_{ i=2}^{n}{(i-1)}=\frac{(n+4)(n-1)}{2} Mmax=i=2n(i1)=2(n+4)(n1)

三 时间复杂度和空间复杂度

由上述分析可知, 当原始数组的初始状态不同时, 直接插入排序算法的时间复杂度有很大差别, 最好的情况是数组初始为正序即升序, 此时的时间复杂度为 O ( n ) O(n) O(n).

最坏的情况是数组初始状态为反序, 此时的时间复杂度为 O ( n 2 ) O(n^{2}) O(n2) .

容易证明该算法的平均时间复杂度也为 O ( n 2 ) O(n^{2}) O(n2). 这时因为对当前无序区 R [ 2.. i − 1 ] ( 2 ⩽ i ⩽ n ) R[2..i-1] (2 \leqslant i\leqslant n) R[2..i1](2in), 平均比较次数为 ( i − 1 ) / 2 (i-1) / 2 (i1)/2,所以总的比较和移动次数约为 n ( n − 1 ) / 4 ≈ n 2 4 n(n-1) /4 \approx \frac{n^2}{4} n(n1)/44n2.

该算法的空间复杂度 S ( n ) 为 O ( 1 ) S(n) 为 O(1) S(n)O(1)

注意概念: 若排序算法所需要的额外空间相对于输入数据量来说是一个常数, 则称该排序为就地排序。
直接插入排序是一个就地排序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.22 Qt day3 多界面跳转+qss登录界面优化+发布软件+对话框

思维导图&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号…

我们在SqlSugar开发框架中,用到的一些设计模式

我们在《SqlSugar开发框架》中&#xff0c;有时候都会根据一些需要引入一些设计模式&#xff0c;主要的目的是为了解决问题提供便利和代码重用等目的。而不是为用而用&#xff0c;我们的目的是解决问题&#xff0c;并在一定的场景下以水到渠成的方式处理。不过引入任何的设计模…

【教3妹学编程-算法题】匹配模式数组的子数组数目 I

3妹&#xff1a;2哥2哥&#xff0c;你有没有看到上海女老师出轨男学生的瓜啊。 2哥 : 看到 了&#xff0c;真的是太毁三观了&#xff01; 3妹&#xff1a;是啊&#xff0c; 老师本是教书育人的职业&#xff0c;明确规定不能和学生谈恋爱啊&#xff0c;更何况是出轨。 2哥 : 是啊…

HarmonyOS—LocalStorage:页面级UI状态存储

LocalStorage是页面级的UI状态存储&#xff0c;通过Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility实例内&#xff0c;在页面间共享状态。 本文仅介绍LocalStorage使用场景和相关的装饰器&#xff1a;LocalStorageProp和LocalS…

大保司保费贵,是否物有所值?

《大保司保费贵&#xff0c;是否物有所值》 这是罗师兄的原创文章 预计8-9分钟读完 作者&#xff1a;罗师兄 微信号&#xff1a;luoyun515 当我们想要买一份重疾险、储蓄险等长期险时&#xff0c; 我们会发现&#xff0c;同样的保障责任和保额&#xff0c; 不同保险公司的…

mac苹果电脑系统最好用的清理软件CleanMyMac2024功能介绍及如何激活解锁许可证

CleanMyMac X的界面设计简洁大气&#xff0c;为用户提供了直观且易于操作的使用体验。 布局清晰&#xff1a;界面布局非常明朗&#xff0c;左侧是功能栏&#xff0c;右侧则是信息界面。这种布局方式使得用户能够迅速找到所需的功能选项&#xff0c;提高了操作效率。色彩搭配&a…

Flutter常用命令,持续更新

目录 前言 Flutter 常用命令 Dart 常用命令 adb 常用命令&#xff08;用于 Android 开发&#xff09; 前言 当在开发Flutter项目时&#xff0c;熟悉一些常用的命令是非常重要的。这些命令可以帮助你执行各种任务&#xff0c;从构建应用程序到调试和测试。以下是一些Flutte…

亿道丨三防平板丨加固平板丨三防加固平板丨改善资产管理

库存资产管理中最重要的部分之一是准确性&#xff1b;过时的库存管理技术会增加运输过程中人为错误、物品丢失或纸张损坏的风险。如今随着三防平板电脑的广泛使用&#xff0c;库存管理也迎来了好帮手&#xff0c;通过使用三防平板电脑能够确保库存管理、数据存储和记录保存的准…

Hive【内部表、外部表、临时表、分区表、分桶表】【总结】

目录 Hive的物种表结构特性 一、内部表 建表 使用场景 二、外部表 建表:关键词【EXTERNAL】 场景&#xff1a; 外部表与内部表可互相转换 三、临时表 建表 临时表横向对比​编辑 四、分区表 建表&#xff1a;关键字【PARTITIONED BY】 场景&#xff1a; 五、分桶表 …

pip安装依赖环境出现的问题

一、error: subprocess-exited-with-error! 1、前期一直百度的错误如标题所示&#xff0c;得到的方案如下&#xff1a;&#xff08;但没解决问题&#xff09; &#xff08;1&#xff09;升级setuptools库&#xff0c;或者降低固定版本 //升级setuptools库&#xff0c;或者降低…

Spark之【基础介绍】

Spark最初是由美国伯克利大学AMP实验室在2009年开发&#xff0c;Spark时基于内存计算的大数据并行计算框架&#xff0c;可以用于构建大型的、低延迟的数据分析应用程序。 Spark是当今大数据领域最活跃、最热门、最高效的大数据通用计算平台之一。 Spark的特点 运行速度快 &am…

L2 清点代码库----PTA(疑问)

上图转自新浪微博&#xff1a;“阿里代码库有几亿行代码&#xff0c;但其中有很多功能重复的代码&#xff0c;比如单单快排就被重写了几百遍。请设计一个程序&#xff0c;能够将代码库中所有功能重复的代码找出。各位大佬有啥想法&#xff0c;我当时就懵了&#xff0c;然后就挂…

用Python插入页码到PDF文档

页码是许多类型文件中的重要内容&#xff0c;它能方便读者在文档中的导航。在创建PDF文档时&#xff0c;添加页码对于组织和引用内容特别有用。在本文中&#xff0c;我们将探讨如何利用Python程序高效地插入页码到PDF文档中&#xff0c;简化工作流程并创建出精美、结构合理的PD…

【selenium】执行 Javascript 脚本 滚动、元素的特殊操作等

某些特殊情况下&#xff0c;使用selenium的api无法操作页面元素&#xff0c;点击、滚动实现的某些功能&#xff0c;可以考虑通过执行js来完成。 为什么不用js写自动化&#xff1f;——selenium第一版是js写的&#xff0c;但js兼容性存在问题&#xff0c;所以引入webdriver 现在…

Vue 中 onclick和@click区别

文章目录 一、直接上结论二、验证代码&#xff0c;可直接运行三、点击结果 一、直接上结论 onclick 只能触发 js的原生方法&#xff0c;不能触发vue的封装方法click 只能触发vue的封装方法&#xff0c;不能触发js的原生方法 二、验证代码&#xff0c;可直接运行 <!DOCTYP…

LiveNVR监控流媒体Onvif/RTSP功能-支持Ehome转GB28181协议isup转GB28181支持海康摄像头海康NVR通过协议ISUP协议接入

LiveNVR支持Ehome转GB28181协议isup转GB28181支持海康摄像头海康NVR通过协议ISUP协议接入 1、海康 ISUP 接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例 3、通道配置3.1、直播流接入类型 海康ISUP3.2、海康 ISUP 设备ID3.3、启用保存3.4、接入成…

yolov5 车牌识别(C#\C++\Python三合一)

本系列给大伙分享一个博主自己利用yolov5实现的一种车牌识别算法&#xff0c;训练样本都是博主自己手动拍照收集的&#xff0c;所以样本数量并不是很完整&#xff0c;目前主要实现的功能就针对绿牌车和蓝牌车的车牌识别&#xff0c;除了能识别出车牌字符外&#xff0c;还能区别…

利用Ubuntu22.04启动U盘对电脑磁盘进行格式化

概要&#xff1a; 本篇演示利用Ubuntu22.04启动U盘的Try Ubuntu模式对电脑磁盘进行格式化 一、说明 1、电脑 笔者的电脑品牌是acer(宏碁/宏基) 开机按F2进入BIOS 开机按F12进入Boot Manager 2、Ubuntu22.04启动U盘 制作方法参考笔者的文章&#xff1a; Ubuntu制作Ubun…

Microsoft的PromptBench可以做啥?

目录 PromptBench简介 PromptBench的快速模型性能评估 PromptBench数据集介绍 PromptBench模型介绍 PromptBench模型加载遇到的问题 第一次在M1 Mac上加载模型 vicuna和llama系列模型 PromptBench各个模型加载情况总结 PromptBench的Prompt快速工程 chain of thought…