数据结构之直接插入排序(算法思想,复杂度分析)以及冒泡排序和直接插入排序的比较

2023-11-15

一般来说,插入排序都采用in-place在数组上实现。

具体算法描述如下:

  1. 从第一个元素开始,该元素可以认为已经被排序。
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已经排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2-5;
    eg:
    在这里插入图片描述

代码如下:直接插入排序:

public static void insertSort(int[] array){
    long start = System.currentTimeMillis();
    int n = array.length;
    if(n <= 1){
        return;
    }else{
        for(int i = 1;i < n;i++){
            int value = array[i];
            int j = i - 1;
            for(;j >= 0;j--){
                if(array[j] > value){
                    //搬移元素
                    array[j+1] = array[j];
                }else{
                    break;
                }
                //已找到插入位置
            }
            array[j+1] = value;
        }
    }

评判算法的三个经典问题:

  1. 插入排序是一个原地排序算法:从实现过程可以看出,插入排序算法的运行并不需要额外的存储空间,所以空间复杂度为O(1);也就是说,这是一个原地排序算法。
  2. 插入排序是稳定的算法:在插入排序中,对于值相同的元素,我们可以选择将后面出现的元素插入到前面出现元素的后面,这样就可以保持原有的前后顺序不变,所以插入排序是稳定的排序算法。
  3. 插入排序的时间复杂度分析:

如果要排序的数据已经是有序的,并不需要搬移数据从头到尾在有序数据组里面找插入位置,每次只需要比较一个数据就能确定插入的位置。在这种情况下,最好的时间复杂度为:O(n)

如果数组是倒序的,每次插入就相当于在数组的第一个位置插入新的数据,所有需要移动大量的数据,最坏情况的时间复杂度为:O(n^2)

对于插入排序来说,每次插入操作都相当于在数组中插入一个数据,循环执行n次插入操作,所以平均时间复杂度为O(n^2)

直接排序与冒泡排序的比较:

冒泡排序和插入排序的时间复杂度都是O(n^2),都是原地排序算法;

比较俩段代码:

//冒泡排序中数据的交换操作
if (a[j] > a[j+1]) {
//交换
      int tmp = a[j]; 
      a[j] = a[j+1];  
      a[j+1] = tmp;  
      flag = true; 
    }
}

//插入排序中数据的移动操作
if (a[j] > value) { 
//数据移动
    a[j+1] = a[j]; 
    } 
    else { 
    break;
}

将执行一个赋值语句的时间粗略的记为单位时间,然后分别用冒泡排序和插入排序对一个逆序度为k的数组进行排序;用冒泡排序需要k次交换操作,每次需要3个赋值语句,则交换总耗时是3*k单位时间;而插入排序中数据移动操作只需要k个单位时间。

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

数据结构之直接插入排序(算法思想,复杂度分析)以及冒泡排序和直接插入排序的比较 的相关文章

  • 华为c语言编程规范_华为自主研发编程语言“仓颉”,“中国话”将走向世界...

    近日 网上曝光华为自研编程语言名字定为 仓颉 char 项目已经进行了很久 预计明年会对外公布一些具体细节 什么是编程语言 编程语言就好比我们生活中 父母用汉语命令孩子 去写作业 这里的汉语就是是编程语言的种类 而 去写作业 这段文字是编程
  • pytorch: 保存和读取参数和模型

    一 保存和读取参数 1 当训练完后 把当前的参数保存下来 import torch torch save net state dict path 保存参数只需用到torch save 其中net为自定义的模型名称 其子参数state dic
  • linux环境下安装Android Studio

    近期将电脑的操作系统换成了Ubuntu 对于不习惯win8 win10的人来说Ubuntu确实是一个不错的选择 主要的软件都ok了 至于QQ什么的 大家能够去找wine版的 或者直接下载一个叫CrossOver的软件进行wine安装 新的操
  • 21 存在重复元素

    题目 题解 方法1 排序 如果有相邻相等的就有重复的 但O n 是nlogn 因为对数组排序呀 class Solution public bool containsDuplicate vector
  • nodejs-post文件上传原理详解

    转自 http cnodejs org topic 4f16442ccae1f4aa270010ad 基础知识 浅谈HTTP中Get与Post的区别 HTTP请求报文格式 简单介绍下 如下图 其中请求报文中的开始行和首部行包含了常见的各种信
  • 服务器里面的文件怎么传送,FTP服务器怎么传送局域网文件

    现如今 网络的使用已经十分普遍 同时也会有各种各样的局域网知识出现 比如 FTP服务器怎么传送局域网文件 学习啦小编在这里为大家详细介绍 使用局域网传送文件的朋友也许都遇过这样的悲事 自己在拷贝移动一个大的文件的时候 在最后几分钟就会完成
  • 企业数字化转型痛点,低代码平台如何解决?

    编者按 数字化能力建设整体尚处于初级阶段 虽然数字技术的发展已经从互联网 大数据时代迈入人工智能时代 但很多企业的数字化转型总体表现并不理想 那么面对数字化转型的痛点 低代码平台是如何解决的呢 来跟小编一起往下看 关键词 可视化开发 API
  • There is no ‘Animation’ attached to the “Player” game object

    There is no Animation attached to the Player game object 在照着龚老师的Unity3D投篮游戏视频教程练习时 遇到这个错误提示 我知道意思 就是player模型导入时 动画没有正确的加
  • Apache logs目录下找不见access.log文件解决办法

    Apache logs目录下找不见access log文件解决办法 原文链接请点击 https www cnblogs com ruoli s p 14561391 html 今天在做测试的时候 忽然发现 咦 我的apache服务器logs
  • 学习java和html必须要知道的英文单词(入门单词,包括C#)

    以前听说学习编程不需要记太多的英语单词 但是我在学习的时候还是碰到许多重要的编程单词 这里给大家稍微整理了一下 非常适合我们这些萌新 一 java入门基础学习单词 第一篇 public p bl k 公开 static st t k 静态
  • java代码审查

    一 概述 代码审查 Code Review 是消灭Bug最重要的方法之一 这些审查在大多数时候都特别奏效 由于代码审查本身所针对的对象 就是俯瞰整个代码在测试过程中的问题和Bug 并且 代码审查对消除一些特别细节的错误大有裨益 尤其是那些能
  • 基于Python/Tkinter的拼图单机小游戏

    这是很早之前写的拼图游戏 基于Py Tk 今天翻出来 然后重新整理 并且发布出来 供大家参考学习 自己看CSDN里有很多了类似的游戏代码 虽然代码逻辑上大同小异 但每个开发者都有自己独特的开发个性和习惯 这并无优劣 而且都可以从代码中都可以
  • Hive 调优总结2

    无需MapReduce 在hive default xml中hive fetch task conversion默认是more 老版本是minimal 该属性改为more后 在全局查找 字段查找 limit查找等都不走mapreduce E
  • 使用ffmpeg将视频文件(Mp4)转换为.ts格式文件,并通过nginx代理在前端访问

    废话不多说 直接上代码 1 编写工具类 Mp4ToTsUtils import java io BufferedReader import java io File import java io IOException import jav
  • 来了,MyBatisPlus的join联表查询!

    来源 juejin cn post 7110405284811522085 使用方法 安装 使用 核心类 MPJLambdaWrapper和MPJQueryWrapper MPJLambdaWrapper用法 MPJQueryWrapper
  • At32f421/gd32f103c6/stmf030

    ADF16ST V5 0遥控器 nf2401 bk2425 2 4g 连接 单片机 spi2 pb port bk3431 蓝牙 连接 单片机 uart3 bk2451 连接单片机 uart1 Q20 A77E BK343 供电控制 R61
  • 分布式系统理论

    说到分布式系统 不得不说集中式系统 传统集中式系统中整个项目所有的东西都在一个应用里面 一个网站就是一个应用 当系统压力较大时 只能横向扩展 增加多个服务器或者多个容器去做负载均衡 避免单点故障而影响到整个系统 集中式最明显的优点就是开发
  • 未授权访问的MongoDB修复方案

    修复方法 1 不要把MongoDB服务器部署在互联网上或者DMZ 开启MongoDB的授权访问 编辑 etc mongo conf 文件 找到 auth true 去掉注释 创建用户管理员 另外再连接MongoDB的时候 public cl
  • Mysql(9)_视图

    1 视图是什么 首先 视图是虚拟的表 是不存在的 若使用jdbc连接它 是会报错的 它本质上是sql语句 其次 物理表是真实存在的表 占用内存空间 视图没有实际的物理记录 而表有 视图 view 是在基本表之上建立的表 它的结构 即所定义的
  • 2D/3D人体姿态估计 (2D/3D Human Pose Estimation)

    1 基本概念 算法改进入口 网络设计 特征流 损失函数 数据集的重要性 只要有一个好的 针对性的数据集 问题都可以解决 过集成新一代AutoML技术 可降低算法试错成本 人体姿态估计 Human Pose Estimation 是指图像或视

随机推荐

  • 字典序及1-n之间的数按字典序排列

    今天在刷LeetCode的时候遇见了一道题 题的要求是 给你一个整数 n 按字典序返回范围 1 n 内所有整数 你必须设计一个时间复杂度为 O n 且使用 O 1 额外空间的算法 开始以为是简单的输出 提交后发现与答案相差甚多 看评论后方了
  • xmind右键无法创建

    xmind右键菜单无法创建 前言 安装xmind 设置鼠标右键菜单 验证是否修复成功 后语 前言 前言 hello 不知大家在安装完xmind后 回到桌面后是否可以右键新建xmind文件 如果不行的话 那我就希望这篇文章能帮到你啦 安装xm
  • for in 循环详解

    for i 循环的作用 for in 语句以任意顺序迭代一个对象的除 Symbol 以外的可枚举属性 包括继承的可枚举属性 for in 是为遍历对象属性而构建的 不建议与数组一起使用 在处理有 key value 数据 用于获取对接的 k
  • 人脸识别demo分析(opencv版本)

    一 faceRecognition接口说明 函数名 faceRecognition 函数描述 人脸识别 参数 int recognitionPic 识别的照片 int targetFaceIndex 目标匹配照片索引值 返回 失败返回 1
  • HTML

    如果想将超出div高度和宽度的内容隐藏就用overflow hidden 如果想让超出的内容显示而div宽高不变 用overflow auto 在原来的div宽高基础上出现滚动条 overflow x hidden 设置宽度超出div宽度后
  • Linux 2.6.19.x 内核编译配置选项简介(转)

    Linux 2 6 19 x 内核编译配置选项简介作者 金步国版权声明本文作者是一位自由软件爱好者 所以本文虽然不是软件 但是本着 GPL 的精神发布 任何人都可以自由使用 转载 复制和再分发 但必须保留作者署名 亦不得对声明中的任何条款作
  • 解决Windows下_findnext()异常

    在windows中 使用文件遍历函数 findnext会报0xC0000005错误 原因 findnext 第一个参数 路径句柄 返回的类型为intptr t long long 要改为long long或者intptr t 获取特定格式的
  • 修改MySQL 数据库名称

    MySQL不支持直接修改数据库名称语法 那么要修改数据库名称该如何操作呢 例如 我们将数据库test 修改为test2 第一步 创建新名称对应的数据库 create database if not exists test2 第二步 获取所有
  • 【JDK】Java环境搭建,配置环境变量

    文章目录 1 JDK的下载与安装 1 1 下载JDK 1 2 安装JDK 1 2 1 压缩版JDK 1 2 2 安装版JDK 2 配置环境变量 2 1 打开环境变量 2 2 修改环境变量 2 2 1 新建 JAVA HOME 变量 2 2
  • 非常好用的 文件上传控件

    http fex baidu com webuploader document html
  • Java 重写 equals和hashcode

    重写equals方法的时候为什么需要重写hashcode
  • SqlServe--从字符串中提取数字

    1 基础使用 声明一个nvarchar类型的变量并赋值 declare Name nvarchar 50 set Name 我正在123学 习22 SQL中11 的一些函数 patindex函数返回所查内容在字符串中第一次出现的内容 pri
  • STM32 (十五)ESP8266WIFI

    简介 1 ESP8266wifi 模块 低功耗串口WiFi模块ESP8266内置一个Tensilica 泰思立达 Xtensa架构的32位处理器L106 具有5级流水线 ARM CortexM3是3级流水线 最大时钟速度为160MHz 可以
  • JMM简单理解

    JMM java内存模型 代码理解 public class test private static boolean f false public static void main String args throws Interrupte
  • Python日志记录基础教程:logging模块详解与示例代码

    Python日志记录基础教程 logging模块详解与示例代码 在Python应用程序的开发过程中 日志记录是一个重要的组成部分 它能够帮助开发人员追踪和调试代码 并记录应用程序的运行情况 Python标准库中的logging模块提供了一个
  • 【计算机视觉

    文章目录 一 CBC Complete Blood Count 二 CURE TSD CURE Traffic Sign Detection 三 DUO Detecting Underwater Objects 四 Duke Breast
  • 方法的重写-overrideoverwrite

    方法的重写 override overwrite 1 定义 定义 子类继承父类以后 可以对父类中同名同参数的方法 进行覆盖操作 应用 重写以后 当创建子类对象以后 通过子类对象调用子父类中的同名同参数的方法时 实际执行的是子类重写的方法 使
  • 2D和3D人体姿态数据集

    转自链接 https www jianshu com p c046db584a21 2D数据集 LSP 地址 http sam johnson io research lsp html 样本数 2k 关节点数 14 全身 单人 FLIC 地
  • 用go实现一个telnet带上账号密码的协议请求

    实现一个telnet协议请求 需要用到网络编程的知识 下面是一份简单的代码示例 package main import bufio fmt net strings func main ln err net Listen tcp 8080 i
  • 数据结构之直接插入排序(算法思想,复杂度分析)以及冒泡排序和直接插入排序的比较

    一般来说 插入排序都采用in place在数组上实现 具体算法描述如下 从第一个元素开始 该元素可以认为已经被排序 取出下一个元素 在已经排序的元素序列中从后向前扫描 如果该元素 已排序 大于新元素 将该元素移到下一位置 重复步骤3 直到找