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

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

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

📚 非线性时间比较类:

📕 插入类排序:[本篇]

📖 直接插入排序

📖 希尔排序

📕 交换类排序:数据结构与算法之排序算法-快速排序(分治)-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)

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

使用直接插入排序

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

使用希尔排序

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

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

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

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

相关文章

cv2小练习

基础概念 帧率是指在单位时间内&#xff0c;显示的图像帧数的数量。它是衡量视频或动画流畅度的一个重要指标。帧率的单位通常是每秒帧数&#xff08;Frames Per Second&#xff0c;简称FPS&#xff09;。在数字视频和计算机图形领域&#xff0c;帧率是决定视频播放质量和流畅度…

在Mac arm架构终端中运行 corepack enable yarn 命令,安装yarn

文章目录 1. 什么是 Corepack&#xff1f;2. 运行 corepack enable yarn 的作用3. 如何运行 corepack enable yarn4. 可能遇到的问题及解决方法问题 1&#xff1a;corepack 命令未找到问题 2&#xff1a;Yarn 未正确安装问题 3&#xff1a;权限问题 5. 验证 Yarn 是否启用成功6…

Spring基于文心一言API使用的大模型

有时做项目我们可能会遇到要在项目中对接AI大模型 本篇文章是对使用文心一言大模型的使用总结 前置任务 在百度智能云开放平台中注册成为开发者 百度智能云开放平台 进入百度智能云官网进行登录&#xff0c;点击立即体验 点击千帆大模型平台 向下滑动&#xff0c;进入到模型…

【Vue中BUG解决】npm error path git

报错内容如下&#xff1a; 从错误信息可知&#xff0c;这是一个 ENOENT&#xff08;No Entry&#xff0c;即找不到文件或目录&#xff09;错误&#xff0c;并且与 git 相关。具体来说&#xff0c;npm 在尝试调用 git 时&#xff0c;无法找到 git 可执行文件&#xff0c;下面为…

(一)Axure制作移动端登录页面

你知道如何利用Axure制作移动端登录页面吗&#xff1f;Axure除了可以制作Web端页面&#xff0c;移动端也是可以的哦&#xff0c;下面我们就一起来看一下Axure制作移动端登录页面的过程吧。 第一步&#xff1a;从元件中拖入一个矩形框&#xff0c;并设置其尺寸为&#xff1a;37…

自动化遇到的问题记录(遇到问题就更)

总结回归下自己这边遇到的一些问题 “EOF错误”&#xff0c;获取不到csv里面的内容 跑多csv文件里的场景&#xff0c;部分场景的请求值为 1、检查csv文件里不能直接是[]开头的参数&#xff0c;把[]改到ms平台的请求参数里 2、有时可能是某个参数值缺了双引号的其中一边 met…

LabVIEW软件需求开发文档参考

在项目开发的工作历程中&#xff0c;精准把握项目需求无疑是成功打造整个项目的首要关键步骤&#xff0c;同时也是一个至关重要且不可忽视的核心环节。明确且详尽的项目需求就如同建筑的基石&#xff0c;为后续的设计、开发、测试等一系列工作提供了坚实的支撑和清晰的指引。倘…

【JVM详解五】JVM性能调优

示例&#xff1a; 配置JVM参数运行 #前台运行 java -XX:MetaspaceSize-128m -XX:MaxMetaspaceSize-128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio8 - XX:UseConcMarkSweepGC -jar /jar包路径 #后台运行 nohup java -XX:MetaspaceSize-128m -XX:MaxMetaspaceS…

android studio下载安装汉化-Flutter安装

1、下载android studio官方地址&#xff1a;&#xff08;这个网址可能直接打不开&#xff0c;需要VPN&#xff09; https://developer.android.com/studio?hlzh-cn mac版本分为X86和arm版本&#xff0c;电脑显示芯片是Inter的就是x86的&#xff0c;显示m1和m2的就是arm的 …

(2025)深度分析DeepSeek-R1开源的6种蒸馏模型之间的逻辑处理和编写代码能力区别以及配置要求,并与ChatGPT进行对比(附本地部署教程)

(2025)通过Ollama光速部署本地DeepSeek-R1模型(支持Windows10/11)_deepseek猫娘咒语-CSDN博客文章浏览阅读1k次&#xff0c;点赞19次&#xff0c;收藏9次。通过Ollama光速部署本地DeepSeek-R1(支持Windows10/11)_deepseek猫娘咒语https://blog.csdn.net/m0_70478643/article/de…

【深度学习入门实战】基于Keras的手写数字识别实战(附完整可视化分析)

​ 本人主页:机器学习司猫白 ok,话不多说,我们进入正题吧 项目概述 本案例使用经典的MNIST手写数字数据集,通过Keras构建全连接神经网络,实现0-9数字的分类识别。文章将包含: 关键概念图解完整实现代码训练过程可视化模型效果深度分析环境准备 import numpy as np impo…

kafka生产端之架构及工作原理

文章目录 整体架构元数据更新 整体架构 消息在真正发往Kafka之前&#xff0c;有可能需要经历拦截器&#xff08;Interceptor&#xff09;、序列化器&#xff08;Serializer&#xff09;和分区器&#xff08;Partitioner&#xff09;等一系列的作用&#xff0c;那么在此之后又会…

docker compose部署flink集群

本次部署2个jobmanager和3个taskmanager 一、部署zookeeper集群 flink使用zookeeper用作高可用 部署集群参考&#xff1a;docker compose部署zookeeper集群-CSDN博客 二、创建目录及配置文件 创建timezone文件&#xff0c;内容填写Asia/Shanghai 手动创建目录&#xff1a…

3dtiles——Cesium ion for Autodesk Revit Add-In插件

一、说明&#xff1a; Cesium已经支持3dtiles的模型格式转换&#xff1b; 可以从Cesium官方Aesset中上传gltf等格式文件转换为3dtiles&#xff1b; 也可以下载插件&#xff08;例如revit-cesium插件&#xff09;转换并自动上传到Cesium官方Aseet中。 Revit转3dtiles插件使用…

html文件怎么转换成pdf文件,2025最新教程

将HTML文件转换成PDF文件&#xff0c;可以采取以下几种方法&#xff1a; 一、使用浏览器内置功能 打开HTML文件&#xff1a;在Chrome、Firefox、IE等浏览器中打开需要转换的HTML文件。打印对话框&#xff1a;按下CtrlP&#xff08;Windows&#xff09;或CommandP&#xff08;M…

Linux(socket网络编程)TCP连接

Linux&#xff08;socket网络编程&#xff09;TCP连接 基础文件目录函数系统进程控制函数fork()exec系列函数void abort(void)void assert(int expression)void exit(int status)void _exit(int status)int atexit(void (*func)(void))int on_exit(void (*function)(int,void*)…

GeekPad智慧屏编程控制(二)

前面已经实现了智慧屏开关的控制了&#xff0c;接下来再继续实现消息的订阅。 先如下图所示增加几个控件&#xff0c;一个按钮&#xff0c;2个文本框&#xff0c;其中右下角的文本框显示的内容会比较多&#xff0c;需要打开多行和右侧滚动条。 然后添加订阅消息的事件&#xf…

Postgresql 开发环境搭建指南(WindowsLinux)

一、Postgresql 简介 PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS)&#xff0c;在灵活的BSD许可证下发行。 RDBMS 是关系数据库管理系统&#xff0c;是建立实体之间的联系&#xff0c;最后得到的是关系表。 ORDBMS在原来关系数据库的基础上&#xff0c;增加了一些新…

设备智能化无线通信,ESP32-C2物联网方案,小尺寸芯片实现大功能

在科技飞速发展的当下&#xff0c;我们的生活正被各类智能设备悄然改变&#xff0c;它们如同一位位无声的助手&#xff0c;渗透到我们生活的每一个角落&#xff0c;让生活变得更加便捷和丰富多彩。 智能插座、智能照明和简单家电设备在家居领域的应用&#xff0c;为我们的生活…

Unity 编辑器热更C# FastScriptReload

工具源码&#xff1a;https://github.com/handzlikchris/FastScriptReload 介绍 用于运行时修改C#后能快速重新编译C#并生效&#xff0c;避免每次改C#&#xff0c;unity全部代码重新编译&#xff0c;耗时旧且需要重启游戏。 使用 需要手动调整AssetPipeline自动刷新模式&…