排序算法(三):插入排序详解

排序算法——插入排序 目录 🎨基本介绍 🎹算法思想 🏸实例 🎠思路分析 🪁代码实现 🛹算法性能分析 🚀时间复杂度 🛴空间复杂度 🛸稳定性 🎨基本介绍 插入式排序属于内部排序法,是对待排序的元素以插入的方式寻找该元素的适当位置,以达到排序的目的。 🎹算法思想 插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,在有序表中从后往前进行比较,将它插入到有 阅读详情

前言: 最近换工作,面试稍微大一点的厂都会被问到算法和数据结构这块知识,得空自己总结一下吧,总结不到位希望大佬指正哈。

情景记忆: 插入排序其实蛮好记的,看排序的名称也很容易联想,“插入”是这个排序的核心思想,那插入的时候是怎么个插入法?你只要知道它是从无序的数据中插入到有序的序列中,你可以联想到体育老师再第一次上课的时候总会给全体同学排队的场景,先拉一个同学站号,再拉第二个与第一个比较身高来确定第二个的位置,再拉第三个与前面两个比较身高来确定位置。。。。。。

逻辑实现: 以上的记忆方法和亲切,这样就很容易记住了。逻辑其实也十分简单,一次从无序队列中拿一个,在有序队列中确定位置。

代码实现:
正向排序:

def insert_sort(my_list):
    n = len(my_list)
    for i in range(0, n):
        location = i
        while location > 0:
            if my_list[location] < my_list[location - 1]:
                my_list[location], my_list[location - 1] = my_list[location - 1], my_list[location]
                location -= 1
            else:
                break
        print("第%s趟:" % (i + 1), my_list)


if __name__ == '__main__':
    my_list = [7, 2, 0, 1, 5, 6, 8, 3, 9, 4]
    insert_sort(my_list)


运行结果:
第1趟: [7, 2, 0, 1, 5, 6, 8, 3, 9, 4]
第2趟: [2, 7, 0, 1, 5, 6, 8, 3, 9, 4]
第3趟: [0, 2, 7, 1, 5, 6, 8, 3, 9, 4]
第4趟: [0, 1, 2, 7, 5, 6, 8, 3, 9, 4]
第5趟: [0, 1, 2, 5, 7, 6, 8, 3, 9, 4]
第6趟: [0, 1, 2, 5, 6, 7, 8, 3, 9, 4]
第7趟: [0, 1, 2, 5, 6, 7, 8, 3, 9, 4]
第8趟: [0, 1, 2, 3, 5, 6, 7, 8, 9, 4]
第9趟: [0, 1, 2, 3, 5, 6, 7, 8, 9, 4]
第10趟: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

逆向排序:

def insert_sort(my_list):
    n = len(my_list)
    for i in range(0, n):
        location = i
        while location > 0:
            if my_list[location] > my_list[location - 1]:
                my_list[location], my_list[location - 1] = my_list[location - 1], my_list[location]
                location -= 1
            else:
                break
        print("第%s趟:" % (i + 1), my_list)



if __name__ == '__main__':
    my_list = [7, 2, 0, 1, 5, 6, 8, 3, 9, 4]
    insert_sort(my_list)
 
 
运行结果:
第1趟: [7, 2, 0, 1, 5, 6, 8, 3, 9, 4]
第2趟: [7, 2, 0, 1, 5, 6, 8, 3, 9, 4]
第3趟: [7, 2, 0, 1, 5, 6, 8, 3, 9, 4]
第4趟: [7, 2, 1, 0, 5, 6, 8, 3, 9, 4]
第5趟: [7, 5, 2, 1, 0, 6, 8, 3, 9, 4]
第6趟: [7, 6, 5, 2, 1, 0, 8, 3, 9, 4]
第7趟: [8, 7, 6, 5, 2, 1, 0, 3, 9, 4]
第8趟: [8, 7, 6, 5, 3, 2, 1, 0, 9, 4]
第9趟: [9, 8, 7, 6, 5, 3, 2, 1, 0, 4]
第10趟: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

选择排序总结:
没有最好的算法只有最合适的算法,一个算法的好坏,与运用的场景通常是于算法的时间复杂度、空间复杂度和稳定性相关的。

时间复杂度:时间复杂度的衡量标准是每次比较和交换位置所花的时间综合,也就是完成排序所花的时间总和称为时间复杂度;计算标准是一次循环(不论循环几次)我们记为n,如果能够差分为二叉树结构的我们记为log n,那么插入排序的时间复杂度我们可用看出是O(n^2)

空间复杂度:空间复杂度的衡量标准是在完成排序的整个过程中是否有申请新的存储空间来完成排序,如果有,且申请的空间越多那么我们则认为该算法的空间复杂度约复杂,那么冒泡排序在过程中没有申请存储空间,所有我们认为插入排序的空间复杂度小(除了自己本身)

稳定性:即在原序列中,list[i]=list[j],且list[i]在list[j]之前,而在排序后的序列中,list[i]仍在list[j]之前,则称这种排序算法是稳定的,否则称为不稳定的,那么我们认为冒泡排序是稳定的,稳定性比较:堆排序、快速排序、希尔排序、选择排序是不稳定的排序算法,而冒泡排序、插入排序、归并排序是稳定的排序算法。

排序算法三:Shell插入排序 在我的博文《“主宰世界”的10种算法短评》中给出的首个算法就是高效的排序算法。本文将对排序算法做一个全面的梳理,从最简单的“冒泡”到高效的堆排序等。上一篇博文《排序算法二:二分(折半)插入排序》讲述了直接插入排序,本文讲述第三种插入排序算法:Shell插入排序。 阅读详情

相关推荐

(三)、排序算法:插入排序

插入排序:从队列外边每进来一个数据,跟已序队列从最大值开始比较,找到合适的位置后, 移动已序队列,并将新来的数据插入到对应的位置。 code 和 调试结果: #include <iostream> using namespace std; template <class T> void insert_sort(T list[],int n) { T in, out,tmp; for (out = 1; out < n; out++) //out从下标1.

p=f/s 380

排序算法总结(1)——插入排序

排序算法的重要性对于学计算机的童鞋来说是不言而喻的,不管是找工作还是考研,那是笔试必考面试必问!偏偏排序算法多,很容易混淆记不住。我以前也做过总结, 总在写在纸上,过一两个月不看又忘光了,故在此写一篇总结,一是为自己留着,二是为其他有需要的人可以做参考。有错误或改进的地方欢迎留言。 废话少说。本文主要总结各种数据结构参考资料上都能见到的常用算法。 主要分为插入排序、交换排序、选择排序、

徒步者 914

Greenplum基础

CREATE DATABASE 是 SQL 命令,用于创建一个新的数据库。name 是你要创建的数据库的名称。这个名称是必须的,并且在同一个数据库服务器上必须是唯一的。可选项,OWNER 指定了新数据库的所有者,如果未指定,新数据库的所有者默认是执行该命令的用户。dbowner 是数据库所有者的用户名。可选项,TEMPLATE 指定了用于创建新数据库的模板。在 PostgreSQL 和 GreenPlum 中,通常有一个名为 template1 的默认模板。如果不指定,就会使用这个默认模板。

m0_57697768的博客 1206

算法系列--排序算法(一)插入排序

前言     准备开始写一个算法系列,记录一下自己学习的过程,参考前人的总结的基础上分享一下自己的理解。欢迎大家私下交换意见。 插入排序的特点保持排序过的集合是有序的,下一个需要排序的元素作为一个节点插入已经有序的集合中。 直接插入排序 图解: 5 2 1 4 8 7 3 6     第一步:2 插入,认为左边的{5}是一个有序集合。 2 ...

Joker_honey的博客 355

告别点不亮!STM32F103驱动HT1621段码屏的常见坑点与调试心得

本文详细解析了STM32F103驱动HT1621段码屏的五大常见问题及解决方案,包括硬件连接、时序控制、RAM地址映射等关键难点。通过实测数据和代码示例,帮助开发者快速排查显示异常问题,提升驱动开发效率。特别针对HT1621与STM32F103的兼容性问题提供了专业调试建议。

weixin_30925435的博客 379

使用Wireshark抓取用户在网站的登陆密码

(POST请求是浏览器向服务器提交数据的方式,我们的用户名和密码就是这样提交出去的),单击点开,发现我们的账号和密码,就被抓取到了,在。(注意哦,要去掉http和/,比如http://www.4399.com/,我们只需要记下4399.com即可)(这句话是筛选数据,就是只显示IP为我们要抓取网站的数据) ,点击右边的蓝色箭头。这就是Wireshark简单的抓取登录密码的教程,只适用于http协议的网站。”打开,是这个样子,上面的数据先不用管,我们先点击左上角红色的方块停止抓包。,然后回车,得到的IP为。

泡泡的博客 1万+

排序算法—插入排序(含C语言代码示例)

插入算法作为几大经典的排序算法之一,它的性能在其中算是比较不错的了(主要是稳定);插入算法的基本原理就是在一串乱序的数字中,首先认为第一个数是有序的,然后从第二个数开始比较,每次比较都与前面排好序的部分由后往前进行比较;比如第二个数和第一个数比较,然后第三个数和先和第二个数比较然后在和第一个数比较,第四个数先和第三个数比较然后再分别和第二、第一个数比较。如果在比较的过程中遇到的后一个数比自己大而前一个数比自己小那么就把自己插入到这两个数之间,然后结束这一轮排序进入下一轮;

weixin_52185996的博客 1万+

3D Slicer:从入门到精通——数据模块之DICOM

该模块允许导入、导出和网络传输DICOM数据。Slicer支持DICOM功能的常用子集,其特定功能由临床研究的需求驱动:从磁盘读取和写入数据集,并通过DIMSE和DICOMweb网络协议进行网络传输——查询检索发送和接收数据集。医学数字成像和通信(DICOM)是信息交换数字放射学的广泛使用标准。在大多数情况下,医院使用的成像设备(CT和MR扫描仪)将生成保存为DICOM对象的图像。DICOM按以下层次结构组织数据患者… 可以有1个或多个研究(单次成像检查) … 可以有1个或多个系列。

walt3433的博客 6064

十大经典排序算法之插入排序(Insertion Sort)

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 通俗点理解就是:每步将一个待排序的记录,按其顺序码大小...

2392

TMC2240 芯片数据手册解读|第十三篇 StallGuard4负载测量(StallGuard4 Load Measurement)

摘要: TMC2240的StallGuard4技术专为StealthChop2静音模式设计,通过SG4_RESULT实时测量电机负载,实现堵转检测、无传感器回零和CoolStep节能。其核心原理基于负载角检测,通过SG4_THRS阈值调节灵敏度,并支持四通道独立测量(SG4_IND_0~3)优化相位平衡。独特功能包括无抖动模式切换补偿(sg_angle_offset),解决StealthChop2与SpreadCycle切换时的电流突变问题。调优时需结合SG4_THRS设定与DIAG验证,确保堵转精准触发。

BackCatK Chen的博客 302

vue2/3 - element表格组件el-table实现懒加载树型(上下级)数据、默认展开和隐藏层级,支持对表格进行修改|新增|删除,解决完成操作后树节点不刷新问题(提供示例代码,一键复制开箱即用

vue2,vue3,elementui,elementPlus,el-table,Table表格组件,表格懒加载数据,element table表格数中的树形结构懒加载,增加后数据不同步更新问题,el-table树形与el-tree树形结构的一键折叠与展开,elementui中el-tree懒加载数据 默认展开最外层节点,Element-plus Table组件树表结构默认展开一级目录,vue实现element table表格树形结构-使用懒加载时-解决子节点增删改后,不刷新子节点数据问题,解决el-tre

✅ 精选推荐文章 1万+

排序算法(三):插入排序

情况时间复杂度最好情况O(n)最坏情况O(n^2)平均情况O(n^2)插入排序是一种简单且直观的排序算法,适用于小规模数据或者数据已经接近有序的情况。通过对插入排序的深入理解,我们可以更好地在不同的应用场景中选择合适的排序算法。在实践中,虽然插入排序不是最优选择,但它在某些情况下(如数据已经部分有序)仍然能发挥优势。

一碗黄焖鸡三碗米饭的博客 1515

VCS NLP 低功耗验证系列(六):功耗分析与优化——SAIF 报告与验证效率提升

本文是VCS NLP低功耗验证系列的第六篇,主要解决功耗数据采集和验证效率优化问题。文章首先介绍了SAIF(Switching Activity Interchange Format)文件在功耗分析中的作用,详细讲解了VCS的Region-Based SAIF功能,包括三个关键系统任务($saif_region_create、$saif_region_exclude、$saif_region_monitor)的使用方法和工程实践建议。接着从编译侧、运行侧和方法学侧三个维度提出了NLP验证效率优化策略,特别强

元直的博客 472

排序算法三:插入排序

插入排序

qijizizi的专栏 713

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

排序算法三: 插入排序

插入排序(Insertion Sort): 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置插入。 算法描述: 一般来书,插入排序都采用 in-place在数组上实现,具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫...

qq_44587855的博客 379

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

基础排序算法三:插入排序

基础排序算法三:插入排序 直接插入排序介绍 直接插入排序(Straight Insertion Sort)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。 直接插入排序的时间复杂度和稳定性 直接插入排序时间复杂...

ccystewart的博客 195

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

排序算法图解(三):插入排序

插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

黄小黄的博客 784

小纳什排序算法学习三:插入排序

public class Solution { // (1) 0~0 有序的 // (2) 0~i 想有序 public static void InsertionSort(int[] arr){ if(arr == null || arr.length < 2){ return; } for(int i = 1; i < arr.length; i++){ //3 for

weixin_37831273的博客 212

整理排序算法(三):插入排序

/** * 插入排序: * 将一个记录插入已经排好序的新序列 * * 1,当初始序列为正序时,只需要外循环n-1次,每次进行一次比较,无需移动元素。 * 此时比较次数(C _{min})和移动次数(M_{min})达到最小值。 * C _{min}=n-1 * M_{min}=0 * 此时时间复杂度为O(n)...

chris_hhao的博客 144
上一篇: 密码学(一):RSA加密长文
下一篇: 笔记:在Linux的CentOS6.9系统下安装Python3.7
一只快死的猿
博客等级 码龄7年 6229粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值