数据结构与算法之排序算法-插入排序

news2025/2/13 21:31:40

排序算法是数据结构与算法中最基本的算法之一,其作用就是将一些可以比较大小的数据进行有规律的排序,而想要实现这种排序就拥有很多种方法~

那么我将通过几篇文章,将排序算法中各种算法细化的,详尽的为大家呈现出来:

📚 非线性时间比较类:

📕 插入类排序:[本篇]

📖 直接插入排序

📖 希尔排序

📕 交换类排序:数据结构与算法之排序算法-快速排序(分治)-CSDN博客

📖 冒泡排序

📖 冒泡排序-优化

📖 快速排序(Hoare,挖坑法,前后指针法)

📖 快速排序-优化

📕 选择类排序:数据结构与算法之排序算法-选择排序-CSDN博客

📖 简单选择排序

📖 堆排序

📕 归并类排序:(博主正在连夜码字中...)

📖 归并排序

📚 线性时间非比较

📕 非比较类排序:(博主正在连夜码字中...)

📖 计数排序

📖 桶排序

📖 基数排序

一、排序算法

① 排序算法的概念

顾名思义,就是对某一部分可以比较大小的元素进行排序,这就意味着排序不仅仅可以是对数字进行排序,我们也可以对一些自己定义的类进行排序,前提是你已经为它们想好了定义优先级的规则,并且重写了它们的比较方法。

② 排序的额外空间复杂度

额外空间复杂度:是指一个算法在运行的过程中,需要额外存储空间所消耗的内存。

额外空间复杂度为O(1):
想象你在厨房里做菜,只需要一个固定的碗来搅拌食材。无论你做的菜量有多大,你始终只需要这一个碗。这个碗就代表了 O(1) 的额外空间,因为它的大小是固定的,不随菜量的增加而改变。

额外空间复杂度为O(n):
假设你在整理书架,每本书都需要一个书签来标记位置。如果你有 n 本书,你就需要 n 个书签。书签的数量与书的数量成正比,这就是 O(n) 的额外空间复杂度。书越多,需要的书签也越多。

③ 排序的稳定性

排序的稳定性:是指在排序算法的排序过程中,当遇到两个相同值的时候,两者的相对位置是否保持不变。如果两者的相对位置保持不变,那么称这个排序算法是稳定的;反之则不是稳定的。

二、插入排序

① 基本思想

在所有的排序算法中,直接插入排序大概算是最简单易懂的一种排序。

插入排序将传入数据中第一个元素看作有序序列,将剩余的元素看作未排序序列。从未排序序列中的第一个元素开始,依次向后进行查找,并且将该元素插入到一个合适的位置,以升序序列为例,那么这个位置就是(扫描到的元素 <= 该元素)。

就像是打扑克的时候,将一张张没进行排序的牌,依次的插入到合适的位置。

② 直接插入排序

稳定性:稳定

时间复杂度:O(n^2)

额外空间复杂度:O(1)

📚 思路

与上述的插入排序基本思想基本一致。

图示

📖 代码示例

    public static void insertSort(int[] array){
         for(int i = 1;i < array.length;i++){
             for(int j = i;j > 0;j--){
                if(array[j - 1] > array[j]){
                    swap(array,j,j - 1);
                }else {
                    break;
                }
            }
         }
    }
    public static void swap(int[] array,int i,int j){
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }

③ 希尔排序(递减增量排序)

稳定性:不稳定

时间复杂度:O(nlog^2 n) [最坏为O(n^2)]

额外空间复杂度:O(1)

📚 思路

希尔排序,也叫做递减增量排序,它是直接插入排序的一种优化版本,它的效率更高,但是缺点是希尔排序不再拥有稳定性。

希尔排序对插入排序的优化是因为:插入排序由于每次只能移动一位数据,所以效率并不高。

希尔排序的基本思想先选定一个整数,将待排序的数据按照一个距离 k 将数组分为若干个子序列,并且按照 k 为每次的移动量进行直接插入排序,当这次通过 k 选取出的若干序列都已有序时,再缩小 k 重新进行上述排序。

注:一般来说,k 取数组长度 / 2,之后的缩小也是不断 / 2。 

图示

📖 代码示例

    public static void shellSort(int[] array) {
        int k = array.length / 2;
        int len = array.length;
        while(k > 0) {
            for (int i = 0; i < len; i++) {
                for(int j = i + k;j >= k && j < len; j -= k){
                    if(array[j - k] > array[j]){
                        swap(array,j,j - k);
                    }else {
                        break;
                    }
                }
            }
            k /= 2;
        }
    }
    private static void swap(int[] array, int i, int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }

使用希尔排序就能够对排序效率大大的优化,这是因为每完成一趟排序,就能够使整个数组变得更趋近于一个有序的数组,而插入排序处理越趋近于有序的数组,效率也就越高~

912. 排序数组 - 力扣(LeetCode)

我们可以通过这个题来对实现的排序算法来检验正确性,并且还能够查看出算法的效率如何:

使用直接插入排序

这边就可以看到,超时了。

使用希尔排序

使用希尔排序优化一下插入排序,就成功通过啦~

那么这篇文章到这里就结束啦,作者能力有限,如果有哪里说的不够清楚或者不够准确,还请各位在评论区多多指出,我也会虚心学习的,我们下次再见啦

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

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

相关文章

基于YoloV11和驱动级鼠标模拟实现Ai自瞄

本文将围绕基于 YoloV11 和驱动级鼠标实现 FPS 游戏 AI 自瞄展开阐述。 需要着重强调的是&#xff0c;本文内容仅用于学术研究和技术学习目的。严禁任何个人或组织将文中所提及的技术、方法及思路应用于违法行为&#xff0c;包括但不限于在各类游戏中实施作弊等违规操作。若因违…

七、I2C通信读取LM75B温度

7.1 概述 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种同步、多主从、串行通信协议&#xff0c;由飞利浦公司开发&#xff0c;主要用于短距离通信&#xff0c;尤其在集成电路之间。 7.1.1 主要特点 两线制&#xff1a;仅需SDA&#xff08;数据线&#xff09;…

CSS 属性选择器详解与实战示例

CSS 属性选择器是 CSS 中非常强大且灵活的一类选择器&#xff0c;它能够根据 HTML 元素的属性和值来进行精准选中。在实际开发过程中&#xff0c;属性选择器不仅可以提高代码的可维护性&#xff0c;而且能够大大优化页面的样式控制。本文将结合菜鸟教程的示例&#xff0c;从基础…

2025 游戏试玩打码平台PHP源码

源码介绍 2025 游戏试玩打码平台PHP源码 开发语言&#xff1a;PHP 数据库&#xff1a;MySQL 源码程序采用yii框架phpMysql语言开发 功能完善&#xff0c;无后门 程序功能有: 1.游戏试玩功能 2.广告体验功能 3.打码功能 4.新人任务 5.开启宝箱功能 6.站长联盟功能 7.兑换商城功…

sql难点

一、 假设你有一个查询&#xff0c;需要根据 id 是否为 null 来动态生成 SQL 条件&#xff1a; xml复制 <select id"getResources" resultType"Resource">SELECT * FROM resources<where><if test"id ! null">and id <!…

oracle表分区--范围分区

文章目录 oracle表分区分区的原因分区的优势oracle表分区的作用oracle表分区类型一、范围分区二、 创建分区表和使用&#xff1a;1、按照数值范围划分2、按照时间范围3、MAXVALUE2. 向现有表添加新的分区3、 分区维护和重新组织&#xff08;合并/删除&#xff09; oracle表分区…

mysql读写分离与proxysql的结合

上一篇文章介绍了mysql如何设置成主从复制模式&#xff0c;而主从复制的目的&#xff0c;是为了读写分离。 读写分离&#xff0c;拿spring boot项目来说&#xff0c;可以有2种方式&#xff1a; 1&#xff09;设置2个数据源&#xff0c;读和写分开使用 2&#xff09;使用中间件…

Untiy3d 铰链、弹簧,特殊的物理关节

&#xff08;一&#xff09;铰链组件 1.创建一个立方体和角色胶囊 2.给角色胶囊挂在控制脚本和刚体 using System.Collections; using System.Collections.Generic; using UnityEngine;public class plyer : MonoBehaviour {// Start is called once before the first execut…

Visual Studio 进行单元测试【入门】

摘要&#xff1a;在软件开发中&#xff0c;单元测试是一种重要的实践&#xff0c;通过验证代码的正确性&#xff0c;帮助开发者提高代码质量。本文将介绍如何在VisualStudio中进行单元测试&#xff0c;包括创建测试项目、编写测试代码、运行测试以及查看结果。 1. 什么是单元测…

Leetcode - 周赛435

目录 一、3442. 奇偶频次间的最大差值 I二、3443. K 次修改后的最大曼哈顿距离三、3444. 使数组包含目标值倍数的最少增量四、3445. 奇偶频次间的最大差值 II 一、3442. 奇偶频次间的最大差值 I 题目链接 本题使用数组统计字符串 s s s 中每个字符的出现次数&#xff0c;然后…

算法之 数论

文章目录 质数判断质数3115.质数的最大距离 质数筛选204.计数质数2761.和等于目标值的质数对 2521.数组乘积中的不同质因数数目 质数 质数的定义&#xff1a;除了本身和1&#xff0c;不能被其他小于它的数整除&#xff0c;最小的质数是 2 求解质数的几种方法 法1&#xff0c;根…

docker 导出导入

1第一步骤docker save docker save -o database-export-4.1.0.tar database-export-4.1.0.jar:latest 2检查镜像ls -l, 注意&#xff1a;文件可能没有其他文件导出权限&#xff1a;chmod 644 database-export-4.1.0.tar 3在新的服务器导入&#xff1a; docker load -i databa…

OSPF高级特性(3):安全特效

引言 OSPF的基础我们已经结束学习了&#xff0c;接下来我们继续学习OSPF的高级特性。为了方便大家阅读&#xff0c;我会将高级特性的几篇链接放在末尾&#xff0c;所有链接都是站内的&#xff0c;大家点击即可阅读&#xff1a; OSPF基础&#xff08;1&#xff09;&#xff1a;工…

基于SSM的农产品供销小程序+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、农户功能模块&#xff1a;用户管理、农户管理、产品分类管理、农产品管理、咨询管理、订单管理、收藏管理、购物车、充值、下单等技术选型&#xff1a;SSM&#xff0c;Vue&#xff08;后端管理web&#xff09;&#xff0c;uniapp等测试…

Unity URP的2D光照简介

官网工程&#xff0c;包括2d光照&#xff0c;动画&#xff0c;动效介绍&#xff1a; https://unity.com/cn/blog/games/happy-harvest-demo-latest-2d-techniques https://docs.unity3d.com/6000.0/Documentation/Manual/urp/Lights-2D-intro.html 人物脸部光照细节和脚上的阴影…

Jenkins 部署 之 Mac 一

Jenkins 部署 之 Mac 一 一.Jenkins 部署依赖 JDK 环境 查看 Mac JDK 环境&#xff0c;如果没有安装&#xff0c;先安装 打开终端输入命令:java -version Mac安装配置 JDK 二. 检查 HomeBrew 安装 检查 HomeBrew 是否安装&#xff0c;终端输入命令:brew -v Mac安装HomeB…

钉钉位置偏移解决,钉钉虚拟定位打卡

虚拟定位打卡工具 一&#xff0c;介绍免费获取工具 一&#xff0c;介绍 提到上班打卡&#xff0c;职场人的内心戏估计能拍成一部连续剧。打卡&#xff0c;这俩字仿佛自带“紧箍咒”&#xff0c;让无数打工人又爱又恨。想象一下&#xff0c;你气喘吁吁地冲进办公室&#xff0c;…

使用DeepSeek和Kimi快速自动生成PPT

目录 步骤1&#xff1a;在DeepSeek中生成要制作的PPT主要大纲内容。 &#xff08;1&#xff09;在DeepSeek网页端生成 &#xff08;2&#xff09;在本地部署DeepSeek后&#xff0c;使用chatBox生成PPT内容 步骤2&#xff1a;将DeepSeek成的PPT内容复制到Kimi中 步骤3&…

Webpack包

黑马程序员视频地址&#xff1a; Node.js与Webpack-16.Webpack简介以及体验 前言&#xff1a; 本篇中部分标题后标有数字&#xff0c;代表学习顺序 &#xff0c;同时也可以作为使用顺序参考 webpack包 基础认识 初步使用 下载webpack包和webpack-cli包 注意点&#xff1a; 1…

鸿蒙HarmonyOS NEXT开发:横竖屏切换开发实践

文章目录 一、概述二、窗口旋转说明1、配置module.json5的orientation字段2、调用窗口的setPreferredOrientation方法 四、性能优化1、使用自定义组件冻结2、对图片使用autoResize3、排查一些耗时操作 四、常见场景示例1、视频类应用横竖屏开发2、游戏类应用横屏开发 五、其他常…