排序第三篇 直接插入排序

news2024/9/9 0:41:07

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

一 简介

插入排序可分为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)

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

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

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

相关文章

【鸿蒙 HarmonyOS 4.0】状态管理

一、介绍 资料来自官网&#xff1a;文档中心 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也将进行对应的改变。这些运行时的状…

【Linux】普通用户sudo失败怎么办

普通用户&#xff0c;sudo失败报错怎么办 问题分析如何解决成功 问题分析 新建的普通用户sudo失败 sudo提权&#xff0c;是以root的身份执行命令。 当我们用sudo提升权限的时候&#xff0c;这里有个问题&#xff0c;Linux会提示我们输入当前普通用户的密码——这就有点不好。…

骨传导耳机哪个品牌比较好?精选五大倍受好评的机型推荐!

近几年大家对保护听力健康的意识也越来越强烈了&#xff0c;骨传导耳机作为保护听力健康的不二之选&#xff0c;使用的人也越来越多&#xff0c;但是&#xff0c;在面对市场上鱼龙混杂的产品时&#xff0c;还是有很多人不知道该怎么去挑选一款性能优秀的骨传导耳机&#xff0c;…

[TCP] TCP/IP 基础知识词典(2)

我想统计一下&#xff0c;TCP/IP 尤其是TCP协议&#xff0c;能搜到的常见的问题&#xff0c;整理起来&#xff0c;关键词添加在目录中&#xff0c;便于以后查阅。 目前预计整理共3篇&#xff1a; [TCP] TCP/IP 基础知识问答 &#xff1a;基础知识 [TCP] TCP/IP 基础知识问答&…

硬盘坏了数据恢复怎么做?记好这2个方法!

“前段时间我的电脑硬盘出了点问题&#xff0c;不知道为什么就坏了。硬盘坏了数据恢复应该怎么做呢&#xff1f;请大家分享几个好用的方法吧&#xff01;” 在数字化时代&#xff0c;硬盘作为数据存储的核心组件&#xff0c;其重要性不言而喻。然而&#xff0c;硬盘损坏是一个常…

【知识分享】自动化测试首选接口自动化?

在分层测试的“金字塔”模型中&#xff0c;接口测试属于第二层服务集成测试范畴。 相比UI自动化测试而言&#xff0c;接口自动化测试收益更大&#xff0c;且容易实现&#xff0c;维护成本低&#xff0c;有着更高的投入产出比。因此&#xff0c;项目开展自动化测试的首选一般为接…

记阿里云mysql丢表丢数据的实践记录

第一时间挂工单&#xff0c;联系工程师指引&#xff0c;现在回过来想&#xff0c;第一时间要确认发生时间。 1.通过性能视图&#xff08;马后炮的总结&#xff0c;实际凭记忆恢复了三四次才找到数据&#xff09; 2.先恢复数据 通过Navicat工具&#xff0c;结构同步&#xff0…

Vscode vim 插件使用Ctrl+C和V进行复制粘贴到剪切板

Vscode vim 插件使用CtrlC和V进行复制粘贴到剪切板 使用这一个插件的时候复制粘贴和其他软件互动的时候体验不好, 并且不可以用Ctrl c, Ctrl v很不爽 "vim.commandLineModeKeyBindings": [{"before" : ["Ctrl", "c"],"after&q…

C#,动态规划(DP)丢鸡蛋问题(Egg Dropping Puzzle)的三种算法与源代码

1 扔鸡蛋问题 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是运筹学的一个分支&#xff0c;是求解决策过程最优化的过程。20世纪50年代初&#xff0c;美国数学家贝尔曼&#xff08;R.Bellman&#xff09;等人在研究多阶段决策过程的优化问题时&#xf…

3.deeplabv3+的深层网络结构的实现

在第一篇文章中我们提到“在encoder部分&#xff0c;主要包括了backbone&#xff08;DCNN&#xff09;、ASPP两大部分”&#xff0c;在这里的backbone就是mobilenetv2网络结构和xception网络结构&#xff0c;而ASPP结构就是深层网络结构&#xff0c;其网络结构如下&#xff1a;…

Anaconda和TensorFlow环境搭建!!

Anaconda下载 进入官网下载 https://www.anaconda.com/download 也可以通过清华的映像站下载&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 我这里下载的是3.4.20版本。下载好就可以安装默认安装就行。 打开Anaconda Prompt修改成国内镜像 conda c…

Verilog刷题笔记36

题目&#xff1a; Create a 4-bit wide, 256-to-1 multiplexer. The 256 4-bit inputs are all packed into a single 1024-bit input vector. sel0 should select bits in[3:0], sel1 selects bits in[7:4], sel2 selects bits in[11:8], etc. 我的解法&#xff1a; module …

【蜂窝物联】医院WiFi全覆盖解决方案

项目背景 随着信息化程度的普及,无线网络覆盖的需求显得愈发突出&#xff0c;移动通信&#xff08;GSM&#xff0c;3G&#xff0c;4G&#xff09;的网络在很多区域无法满足客户的速率要求&#xff0c;而且不能满足某些特定场景的业务需求。医院是人流密集场所&#xff0c;进行…

C语言——指针——第1篇——(第19篇)

坚持就是胜利 文章目录 1.指针是什么2.指针和指针类型&#xff08;1&#xff09;指针 - 整数&#xff08;2&#xff09;指针 的 解引用 3.野指针(1)野指针成因1.指针未初始化2.指针越界访问3.指针指向的空间释放 (2)如何规避野指针1.指针初始化2.小心指针越界3.指针指向的空间…

Diehl EDI 项目案例

代傲Diehl 是一家拥有120多年历史的德国科技企业&#xff0c;凭借其多元化的产品在不同工业领域的各个业务线中备受好评。 由于Diehl的合作伙伴遍及全球&#xff0c;如何管理来自全球各地不同标准、不同格式的业务数据成为一大难题。EDI&#xff08;Electronic Data Interchan…

win系统下安装php8.3版本并配置环境变量的详细教程

本篇文章主要讲解在win系统下安装和配置php8.3版本&#xff0c;并配置环境变量的详细教程。 日期&#xff1a;2024年2月22日 作者&#xff1a;任聪聪 一、下载php8.3版本包 php8.3版本官方下载地址&#xff1a;https://windows.php.net/download#php-8.3 步骤一、打开下载地址…

四、矩阵的分类

目录 1、相等矩阵 2、同形矩阵 3、方阵&#xff1a; 4、负矩阵、上三角矩阵、下三角矩阵&#xff1a; 5、对角矩阵&#xff1a;是方阵 ​编辑7、单位矩阵&#xff1a;常常用 E或I 来表示。它是一个方阵 8、零矩阵&#xff1a; 9、对称矩阵&#xff1a;方阵 1、相等矩阵 …

JAVA IDEA 项目打包为 jar 包详解

前言 如下简单 maven 项目&#xff0c;现在 maven 项目比较流行&#xff0c;你还没用过就OUT了。需要打包jar 先设置&#xff1a;点击 File > Project Structure > Artifacts > 点击加号 > 选择JAR > 选择From modules with dependencies 一、将所有依赖和模…

docker部署seata1.6.0

docker部署seata1.6.0 Seata 是 阿里巴巴 开源的 分布式事务中间件&#xff0c;解决 微服务 场景下面临的分布式事务问题。需要先搭建seata服务端然后与springcloud的集成以实现分布式事务控制的过程 &#xff0c;项目中只需要在远程调用APi服务的方法上使用注解 GlobalTransa…

1.1_1 计算机网络的概念、功能、组成和分类

文章目录 1.1_1 计算机网络的概念、功能、组成和分类&#xff08;一&#xff09;计算机网络的概念&#xff08;二&#xff09;计算机网络的功能&#xff08;三&#xff09;计算机网络的组成1.组成部分2.工作方式3.功能组成 &#xff08;四&#xff09;计算机网络的分类 总结 1.…