数据结构与算法之排序: 插入排序 (Ts, Py, Go版)

地平线J6的基础简介 地平线J6M芯片:面向中阶辅助驾驶市场的高性价比芯片 阅读详情

排序

  • 排序:把某个乱序的数组变成升序或降序的数组 (这里用数组来做举例)

插入排序

  • 该排序属于 贪心 策略
  • 关注的是局部,是一种苟且的东西
  • 思路
    • 从第二个数开始往前比
    • 比它大就往后排
    • 以此类推进行到最后一个数,最后一个是最大的,里面每一轮结束,里面都是有序的

Typescript 版算法实现


// 随机数组,插入排序
function insertionSort(nums: number[]) {
    const len: number = nums.length;
    for(let i: number = 1; i < len; ++ i) {
        const tmp: number = nums[i]; // tmp记录当前开始处理的元素,就是你手中的当前要插入的牌
        let j: number = i; // j从i开始
        // while循环往前比
        while(j > 0) {
            if(nums[j - 1] > tmp) {
                nums[j] = nums[j - 1] // 当前位置和前一个位置进行值交换
            } else {
                // 所有都有序
                break;
            }
            --j;
        }
        // while循环之后,记录j的位置,j最终会降落到一个不能再降的位置(不一定是0)使之当前整体有序 
        // j 也就是 tmp 变量值应该插入的位置
        // 交换开始位置,if 提高性能
        if(i != j) {
            nums[j] = tmp;
        }
    }
}

const list: number[] = [5, 4, 3, 2, 1];
insertionSort(list);
console.log(list); // [1, 2, 3, 4, 5]
  • 在排序小型数组时,性能比选择排序和冒泡都要好,也是贪心算法
  • 时间复杂度
    • O(n^2)

Python3 版算法实现


1 ) 方案1

def insertion_sort(nums: list) -> None:
    length = len(nums)
    for i in range(1, length):
        tmp = nums[i]  # tmp记录当前开始处理的元素,就是你手中的当前要插入的牌
        j = i  # j从i开始
        # while循环往前比
        while j > 0:
            if nums[j - 1] > tmp:
                nums[j] = nums[j - 1]  # 当前位置和前一个位置进行值交换
            else:
                # 所有都有序
                break
            j -= 1
        # while循环之后,记录j的位置,j最终会降落到一个不能再降的位置(不一定是0)使之当前整体有序
        # j 也就是 tmp 变量值应该插入的位置
        # 交换开始位置,if 提高性能
        if i != j:
            nums[j] = tmp

# 示例用法
if __name__ == "__main__":
    list_ = [5, 4, 3, 2, 1]
    insertion_sort(list_)
    print(list_)  # 输出: [1, 2, 3, 4, 5]

Golang 版算法实现


1 ) 方案1

package main

import (
	"fmt"
)

func insertionSort(nums []int) {
	length := len(nums)
	for i := 1; i < length; i++ {
		tmp := nums[i] // tmp记录当前开始处理的元素,就是你手中的当前要插入的牌
		j := i         // j从i开始
		// while循环往前比
		for j > 0 {
			if nums[j-1] > tmp {
				nums[j] = nums[j-1] // 当前位置和前一个位置进行值交换
			} else {
				// 所有都有序
				break
			}
			j--
		}
		// while循环之后,记录j的位置,j最终会降落到一个不能再降的位置(不一定是0)使之当前整体有序
		// j 也就是 tmp 变量值应该插入的位置
		// 交换开始位置,if 提高性能
		if i != j {
			nums[j] = tmp
		}
	}
}

func main() {
	list := []int{5, 4, 3, 2, 1}
	insertionSort(list)
	fmt.Println(list) // 输出: [1, 2, 3, 4, 5]
}

YOLOv8 交通违规检测各个场景的实际应用 本文介绍了基于YOLOv8的交通违规检测系统在不同场景下的应用实现。系统可检测闯红灯、超速、违停和不系安全带等多种违规行为,针对每种场景提供了具体的技术方案和Python实现代码。其中闯红灯检测结合信号灯状态分析,超速检测通过距离时间计算速度,违停检测采用长时间跟踪策略,安全带检测则需更高精度识别。文章还展示了如何整合各功能构建综合交通监管系统,并总结了不同应用场景的技术要点和优化方向,为智能交通管理提供了实用解决方案。 阅读详情

相关推荐

STM32 FOC半周期控制延时分析与硬件同步配置

在电机矢量控制(FOC)系统中,数字控制延时是影响电流环带宽、观测器收敛性与系统稳定性的核心瓶颈。其本质源于PWM更新、ADC采样与计算执行之间的时序错配,典型表现为1.5个PWM周期的相位滞后,导致滑模观测器(SMO)失效或高速振荡。通过零阶保持(ZOH)建模可量化该延时对系统相频特性的影响,并揭示其等效为0.5u(t)+0.5u(t−1)的平滑控制律。工程上突破的关键在于重构外设协同机制——以高级定时器重复计数器(RCR0)驱动中心对齐PWM的半周期更新事件,使控制量在0.5T_PWM内生效,同步触发多

flink9streamer的博客 1132

数据结构与算法之排序: 希尔排序 (Ts, Py, Go版)

希尔排序是插入排序的一种,是针对直接插入排序算法的改进

Wang的专栏 523

ADRV9009学习资料保存:基于XC7Z100+ADRV9009的双收双发无线电射频板卡

ADRV9009学习资料保存:基于XC7Z100+ADRV9009的双收双发无线电射频板卡 一、板卡概述 基于XC7Z100+ADRV9009的双收双发无线电射频板卡是基于XilinxZYNQFPGA和ADI的无线收发芯片ADRV9009开发的专用功能板卡,用于5G小基站,无线图传,数据收发...

9382

数据结构与算法之排序: 快速排序 (Ts, Py, Go版)

1 ) 简单版本,消耗内存 2 )基于指针版本, 优化内存

Wang的专栏 627

Microchip Studio 7.0 从下载到项目调试:AVR开发者的完整入门指南(附常见问题解决)

本文为AVR开发者提供了Microchip Studio 7.0从下载安装到项目调试的完整入门指南。详细介绍了如何获取安装包、创建第一个AVR工程项目,并配置编译与调试环境。同时,文章重点解决了开发过程中常见的编译错误和仿真问题,帮助开发者快速上手并高效使用这一官方集成开发环境。

joy55的博客 336

MFC 修改CheckBox的文本颜色方法

设置主题 这一步是必须的,不可省略。 BOOL CMFCApplication1Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 // 设置主题 HWND

Kim的博客 2249

Hello 算法导读:从查字典、整理扑克与找零看二分查找、插入排序与贪心算法

在《Hello 算法》(hello-algo)的开篇导读中,本章的核心论点是:**我们早已在不知不觉中掌握了许多算法,只是没有叫出它们的名字**。本文以原导读文档的三个经典生活实例为骨架——查字典、整理扑克、货币找零,逐一还原其算法本质,并深入仓库中的 Python 参考实现(二分查找、插入排序、贪心找零),帮助读者建立"生活问题 → 算法模型 → 可运行代码"的完整映射能力。 [![查字典:二

gitblog_00006的博客 493

EPLAN二次开发实战:从API接口到定制化功能的完整指南

本文为电气工程师和自动化设计师提供了一份EPLAN二次开发的完整实战指南。文章详细介绍了从脚本、插件到独立程序三种开发模式,重点讲解了如何使用C#或VB.NET通过API接口操作EPLAN数据模型,实现定制化功能以提升设计效率,并分享了开发环境搭建、调试及项目打包分发的避坑经验。

c6d7e8f9g的博客 1125

插入排序(Insertion Sort)深度解析:《Hello 算法》排序章节的稳定基石与实战指南

本文以《Hello 算法》英文文档 [insertion_sort.md](https://link.gitcode.com/i/fc796924a00fa4a6f74985fe5d8d05a3) 为主体,系统讲解插入排序(Insertion Sort)的思想、完整算法流程、复杂度与稳定性分析,并对照本仓库 [en/codes](https://link.gitcode.com/i/861495d

gitblog_00608的博客 698

YOLO11涨点优化:Loss魔改 | WIoU (Wise-IoU) v3版本全面替换,基于动态非单调聚焦机制,让模型更聪明地学习

YOLOv11目标检测中的WIoU v3损失函数改进 本文探讨了YOLOv11目标检测模型中CIoU损失函数的局限性,并提出了WIoU v3改进方案。关键发现包括: CIoU的缺陷:在低质量样本(小目标/遮挡目标)上过度惩罚,导致模型优化方向偏离,小目标AP往往比大目标低30%左右。 WIoU v3的创新: 动态非单调聚焦机制:根据样本"离群度"智能分配梯度 让模型重点优化中等质量样本,减少对低质量样本的无效关注 采用指数移动平均来自适应调整质量评判标准 实际效果:WIoU v3在保持大

2601_95807009的博客 425

锁的艺术:Java并发中的常用锁策略与实践

对java锁相关内容进行整理分析:乐观锁 VS 悲观锁+自旋锁 VS 适应性自旋锁+无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁+公平锁 VS 非公平锁+可重入锁 VS 非可重入锁+独享锁 VS 共享锁

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 171万+

Hello 算法排序章小结:七种经典排序算法的原理、优化与选型全解析

本文基于《Hello 算法》排序章的小结文档([docs/chapter_sorting/summary.md](https://link.gitcode.com/i/666ee32a0a4f96eae555656ba6bcd6ac)),系统回顾冒泡、插入、快速、归并、桶、计数与基数七种排序算法的核心思想与时间复杂度结论,并结合仓库中 [Python 实现代码](https://link.gitc

gitblog_01002的博客 972

【计算机视觉 | MMDetection】关于mmdetection如何计算参数量、计算量和速度FPS

【计算机视觉 | MMDetection】关于mmdetection如何计算参数量、计算量和速度FPS

wzk4869的博客 3022

7种排序算法动画详解:从冒泡到堆排序的实战指南

排序算法是编程基础中的核心知识,也是面试和实际开发中频繁使用的技能。《Hello 算法》项目提供了动画图解、一键运行的数据结构与算法教程,支持 Java, C++, Python 等多种语言,帮助开发者直观理解排序算法的工作原理。本文将通过动画图解方式,详细解析7种常用排序算法的实现过程、优缺点及适用场景,让你轻松掌握排序算法的精髓。 ## 排序算法概览:选择最适合你的排序方案 🚀 排序算法

gitblog_00974的博客 531

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Hello 算法「算法无处不在」导读:从查字典、理扑克到找零钱,认识生活中的算法雏形

《Hello 算法》(hello-algo) 是一本动画图解、支持一键运行的算法入门书。本文对应日文版序章 [ja/docs/chapter_introduction/algorithms_are_everywhere.md](https://link.gitcode.com/i/cbb9b9452f5b7b9677e472f960dede91),从三个最不起眼的生活习惯——查字典、整理扑克牌、超

gitblog_00071的博客 666

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

hello-algo 俄语版数据结构与算法术语表:英俄中三语对照与仓库源码印证

本文基于《Hello 算法》(hello-algo)仓库俄语文档附录中的术语表([terminology.md](https://link.gitcode.com/i/3bed2c2ddb4f88013459a6f07cc20f1c)),完整收录全书 128 个核心数据结构与算法术语的英俄对照(并补充简体中文对照),将这些术语按复杂度分析、数组链表、栈队列、哈希、树、堆、图、查找排序、分治、回溯、

gitblog_00380的博客 425

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Hello 算法:数据结构与算法的定义、设计权衡及其关系深度解析

本篇技术指南围绕《Hello 算法》仓库中 [what_is_dsa.md](https://link.gitcode.com/i/cdbabafaae34c68191015dd3dceb9e73) 文档展开,系统阐述算法与数据结构的标准定义、设计目标与核心权衡,并结合同一仓库中 `codes/` 目录下多语言实现源码,印证"数据结构与算法相互依存、独立于编程语言"这一核心论断,帮助初学者建立准确

gitblog_01121的博客 302

Hello Algo 开篇导读:什么是算法与数据结构——定义、特性、设计权衡与二者关系

算法与数据结构是计算机科学的两块基石,也是《Hello Algo》(本项目即 hello-algo 开源仓库)整本教程的逻辑起点。本篇文章基于 [en/docs/chapter_introduction/what_is_dsa.md](https://link.gitcode.com/i/378b2c51817a98a5e149e44c8d93317b) 的核心内容,系统梳理"算法是什么""数据结

gitblog_00103的博客 815

Hello 演算法之「初識演算法」小結:日常生活中的演算法、資料結構本質與工程思維

本章小結是《Hello 演算法》(hello-algo)繁體中文版「初識演算法」章的收束之篇,將前面兩篇([演算法無處不在](https://link.gitcode.com/i/9afac6d240e8cbfcf07eeaa8e2bb7895)、[演算法是什麼](https://link.gitcode.com/i/3986d8d6e72805fc47308df964d324a2))的核心概念濃

gitblog_01061的博客 917

選擇排序(Selection Sort)原理與實作全解析:從演算法流程到複雜度特性 —— 基於《Hello 算法》

選擇排序是《Hello 算法》排序章節中最直觀、最適合入門的比較排序演算法之一:它不依賴複雜的資料結構,僅靠「每輪挑出未排序區間的最小元素並放到已排序區間末尾」這一個簡單不變式即可完成整個陣列的排序。本篇以 [選擇排序章節](https://link.gitcode.com/i/cff716b77e683f5945e2b40c41338188) 為核心骨架,結合倉庫中 Python、Java、C+

gitblog_01197的博客 1009

Hello 算法排序章节总结:九大排序算法的复杂度对照、取舍原则与高频疑难解析

本指南是《Hello 算法》中"排序"章节的**章节总结型技术梳理**,以 [en/docs/chapter_sorting/summary.md](https://link.gitcode.com/i/0da3b5bd5eaddf491a9f00547b59f2fd) 为骨架,将冒泡、插入、快速、归并、桶、计数、基数等九大排序算法的核心要点浓缩成一张可复用的"知识地图",并深入解答"稳定性何时必

gitblog_00682的博客 341

《Hello 算法》桶排序(Bucket Sort)深度解析:线性时间非比较排序与均匀分桶策略

桶排序(bucket sort)是《Hello 算法》排序章节中典型的「非比较排序」算法,它放弃两两比较元素的路线,转而借助「分治」思想将数据先分散到若干有序区间(桶)中,再逐个桶排序、按序合并,从而在理想情况下把排序时间复杂度推进到线性阶 $O(n)$。本文以 [ru/docs/chapter_sorting/bucket_sort.md](https://link.gitcode.com/i/

gitblog_01021的博客 850

《Hello 算法》桶排序深度解析:线性时间非比較排序的流程、特性與平均分配策略

桶排序(bucket sort)是《Hello 算法》排序章節中介紹的第一種「非比較排序演算法」,它跳脫了「比較元素大小」的框架,改用「分桶 + 桶內排序 + 依序合併」的思路,在理想情況下將時間複雜度從比較排序的 $\Omega(n \log n)$ 下界推進到 $O(n)$。本文以繁體中文版 [桶排序章節](https://link.gitcode.com/i/4af7789c7b438869

gitblog_00215的博客 904

Hello 算法中冒泡排序的实现原理、效率优化与多语言代码解析

冒泡排序(bubble sort)通过连续地比较与交换相邻元素实现排序:这个过程就像气泡从底部升到顶部一样,因此得名。本篇技术文章基于《Hello 算法》仓库中 [冒泡排序](https://link.gitcode.com/i/8f266e7cb9ade7515a16b499d13a9498) 一章,系统讲解其算法流程、`flag` 标志位优化与复杂度特性,并对照仓库内 Python、Java、

gitblog_00947的博客 408

《Hello 算法》堆排序(Heap Sort)详解:从建堆到原地排序的完整流程与多语言源码实现

堆排序(Heap Sort)是一种基于“堆”这一数据结构实现的排序算法,其核心思路是反复利用“建堆 + 元素出堆”把最大值搬移到位,最终在原数组上完成原地升序排列。本文以 [ru/docs/chapter_sorting/heap_sort.md](https://link.gitcode.com/i/0090dd931eb16e28d97a57d35c9fc5d3)(对应中文版 [docs/ch

gitblog_00802的博客 202

《Hello 算法》快速排序深度解析:哨兵划分、分治流程与基准数/递归深度优化实战

本文以《Hello 算法》项目「排序」章节中的快速排序(quick sort)主题文档 [ja/docs/chapter_sorting/quick_sort.md](https://link.gitcode.com/i/87f53ea8f4b1b5a5e507cc7e9857d3df) 为骨架,结合仓库内 Python、C、C++、Go 等多语言源码实现,系统讲解快速排序的核心操作「哨兵划分」、

gitblog_00297的博客 91
上一篇: 数据结构与算法之排序: 快速排序 (Ts, Py, Go版)
下一篇: 数据结构与算法之排序: 归并排序 (Ts, Py, Go版)
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值