插入排序及其Python实现

python:实现insertion sort插入排序(附完整源码) 阅读详情

插入排序

  插入排序每步将一个带排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,知道对象全部插入为止。插入排序边插入边排序,子序列随时都是排好序的。
  插入排序一般分三步进行:
 (1)在R[1…i-1]中查找R[i]的插入位置; R[1..j].key < R[i].key< R[j+1..i-1].key
 (2)将R[j+1..i-1]中的所有记录均后移一个位置;
 (3)将R[i]插入到R[j+1]的位置上。
插入排序
  根据具体实现方法的不同可分为基于顺序查找的直接插入排序、基于折半查找的折半插入排序、基于链表存储的表插入排序、基于逐趟缩小增量的希尔排序。

1.直接插入排序

  直接插入排序主要利用顺序查找实现在R[1..i-1]中查找R[i]的插入位置,是一种稳定的排序算法。具体做法:R[0]作为监视哨,从R[i-1]起向前进行顺序查找,寻找R[i]的插入位置;在查找过程中找到的关键字不小于R[i].key的记录,在查找的同时,实现记录向后移动,循环结束后可以直接插入R[i]。

[13, 6, 3, 31, 9, 27, 5, 11]
第 1 次: [【13】, 6, 3, 31, 9, 27, 5, 11]
第 2 次: [【6, 13】, 3, 31, 9, 27, 5, 11]
第 3 次: [【3, 6, 13】, 31, 9, 27, 5, 11]
第 4 次: [【3, 6, 13, 31】, 9, 27, 5, 11]
第 5 次: [【3, 6, 9, 13, 31】, 27, 5, 11]
第 6 次: [【3, 6, 9, 13, 27, 31】, 5, 11]
第 7 次: [【3, 5, 6, 9, 13, 27, 31】, 11]
第 8 次: [【3, 5, 6, 9, 11, 13, 27, 31】]

一般情况下,直接插入排序的时间复杂度为O(n2),空间复杂度为O(1)(监视哨R[0]占用1空间)
如果记录基本有序,则每次只需比较一次,将R[i]直接加入到有序序列中,最好情况下的事件复杂度为O(n)

def direct_insert_sort(R):
    num = len(R)
    print "第 1 次:", R[1:]
    for i in range(2, num):  # start sorting from the second record
        R[0] = R[i]
        if R[i-1] <= R[0]:
            R[i] = R[0]
        else:
            for t in range(i):  # find the place to insert R[i]
                j = i-t
                if R[j] > R[0]:
                    R[j+1] = R[j]  # R[j]记录后移
                if R[j-1] <= R[0]:
                    R[j] = R[0]  # 记录R[i]插入位置j
                    break
        print "第", i, "次:", R[1:]
    return R

2.折半插入排序

  折半插入排序是在直接插入排序的基础上改进的插入排序算法。R[1..i-1] 是一个按关键字有序的有序序列,则可以利用折半查找实现“在R[1..i-1]中查找R[i]的插入位置”,把原来位置上的元素向后顺移。
  在已形成的有序表中折半查找,比较的次数大大减少,全部元素的比较次数为O(nlog2n)。但由于移动次数并未减少,所以折半插入排序的时间效率依然为O(n2),空间效率仍为O(1),是一种稳定的排序算法。

def half_insert_sort(R):
    num = len(R)
    for i in range(2, num):
        R[0] = R[i]
        if R[i-1] <= R[i]:
            R[i] = R[0]
        else:
            # 找到位置m插入 R[i]
            low = 0
            high = i - 1
            while low <= high:  
                m = (high + low)/2
                if R[m] > R[0]:
                    high = m - 1
                else:
                    low = m + 1
            R[m+1:i+1] = R[m:i]  #R[m:i]记录后移
            R[m] = R[0]  # insert R[i] on the record m
    return R

  如果记录用链表结构存储,用直接插入排序无需移动元素,时间效率更高。但是链表结构无法进行折半查找。

3.希尔排序(缩小增量排序)

  希尔排序的基本思想是先将整个带排序记录序列分割成若干个子序列,分别进行直接插入排序,待整个序列中的记录”基本有序“时,在对记录进行一次直接插入排序。值得注意的是子序列的构成不是简单地逐段分割,而是将相隔某个增量dk的记录组成一个子序列,让增量dk逐趟缩短(如依次取5,3,1),知道dk=1为止。
  希尔排序的优点是让关键值小的元素能很快的前移,并且在序列基本有序时,在使用直接插入排序处理,时间效率会大大提高。希尔排序的时间效率根据经验公式在O(n1.25)~O(1.6n1.25)。空间效率仍为O(1)。但由于记录交换位置后再采用直接插入排序,希尔排序算法并不稳定。

def shell_sort(R):
    num = len(R) - 1
    print R[1:]
    for dk in [5,3,1]:
        if num % dk == 0:
            dk_num = num/dk
        else:
            dk_num = num/dk + 1
        for a in range(dk):
            # 将dk增量记录存储到列表l,直接插入排序后赋值到列表R中,思路清晰但空间复杂度为O(n)
            # 也可不单独存储为l,空间复杂度为O(1)
            l = []
            for i in range(dk_num):
                if (1+a+dk * i) <= num:
                    l.append(R[1+a + dk * i])
            l.insert(0, 0)
            print dk, l
            for i in range(2, len(l)):
                l[0] = l[i]
                if l[i] >= l[i-1]:
                    l[i] = l[0]
                else:
                    for t in range(i):
                        j = i - t
                        if l[j] > l[0]:
                            l[j+1] = l[j]
                        if l[j-1] <= l[0]:
                            l[j] = l[0]
                            break
            for i in range(len(l) - 1):
                R[1+a + i * dk] = l[i + 1]
        print R[1:]
        return R

希尔排序的中间过程:

[13, 6, 3, 31, 9, 27, 5, 11]
第 1 次dk=5:[13, 27, 49, 55, 4, 49, 38, 65, 97, 76]#13 27排序 
第 2 次dk=3:[13, 4, 49, 38, 27, 49, 55, 65, 97, 76]#13 31 5排序
第 3 次dk=1:[4, 13, 27, 38, 49, 49, 55, 65, 76, 97]#5,6,3,13,9,27,31,11排序 
从DDH到FastANI:原核生物分类黄金标准的进化史与技术对比 本文系统梳理了原核生物分类标准从DDH到FastANI的四次技术革命,详细解析了95%相似度阈值的科学依据及应用场景。通过对比DDH、16S rRNA、ANI和FastANI的技术特点与性能指标,为微生物研究者提供基因组分类的实战指南,并展望第三代测序时代的分类新挑战。 阅读详情

相关推荐

blender中合并的模型,在threejs中显示多个mesh;blender多材质烘培成一个材质

5、优化项(省略此步骤,直接进行步骤6),进入到视图着色方式(此时没有灯光,整体偏暗,如果不调整灯光,烘培出来的材质也偏暗,因此此步骤为优化项,通畅建议调整)。在右边栏进入世界环境,调整颜色。7、烘焙成功之后,新建一个材质,将第三步创建的纹理图像作为材质的纹理,连接到基础色,并把模型的材质改为此材质,其他的材质全部删除。2、处理uv,在侧边栏选择数据-uv贴图,选中使用的uv,进入编辑模式,全选,键盘u,选择智能uv投射。3、处理材质,在侧边栏选择材质,进入着色,在着色器编辑器新建一个图像纹理,新建图像。

AllBluefm的专栏 2529

003 插入排序python实现

详细讲解了插入排序的原理及代码

weixin_45359980的博客 825

基于Python的数据结构实验——内排序(直接插入排序,希尔排序,冒泡排序,快速排序,选择排序,堆排序,归并排序)(附详细代码和注释)

调用 AdjustPartition(self,low,high)方法对指定部分的序列进行分区;调用 InsertSort()方法对序列 SSequenceList 进行排序。调用 QuickSort(self,low,high)方法对序列进行排序。调用 MergeSort()方法对序列进行归并排序。调用 BubbleSort()方法对序列进行排序。调用 SelectSort()方法对序列进行排序。调用 ShellSort()方法对序列进行排序。调用 HeapSort()方法对序列进行堆排序。

为人民服务 1178

遗传算法优化光学超表面:智能设计突破纳米结构瓶颈

光学超表面设计本质上是一个高维、非线性、离散每个结构单元(如纳米砖柱、孔洞、十字架)有多个参数(长、宽、高、旋转角、材料),整个阵列的参数组合数量随单元数指数级增长。性能指标(如聚焦效率、工作带宽、偏振转换率、特定角度响应)往往无法用简单解析式表达,需依赖计算密集型电磁仿真(如FDTD, FDFD, RCWA)来评估。结构参数微小变化可能引起光学响应的剧烈跃变,目标函数存在多个局部最优解。实际制造通常要求结构参数取自有限的离散值(如特定刻蚀深度、材料库)。

weixin_51101456的博客 1141

在win10系统上安装opnet14.5注意事项和步聚

opnet 14.5安装避坑!

miracle_eicont的专栏 1037

python实现插入排序

算法思想:插入排序,首先是将列表表示成一副扑克, def Insert_Sort(li): for i in range(1,len(li)):##表示摸到手里的牌的下标 j = i-1##表示手里的牌的下标 temp = li[i] #手里的牌存起来 while j >= 0 and li[j] > temp:###手里的牌>摸到手里的 li[j+1] = li[j]##现在手里的牌向后移动

wcc8848的博客 493

LS-DYNA壳单元冲击仿真中的5个关键设置:以方管碰撞为例(含沙漏控制参数)

本文以方管碰撞为例,深入解析了LS-DYNA壳单元冲击仿真中的五个关键设置。重点探讨了沙漏控制参数(如IHQ=4)的选择逻辑、自接触算法优化、能量监控方法、材料模型(MAT_24)的真实应力-应变曲线与应变率效应设置,以及单元公式的选取。这些核心设置共同决定了仿真的精度与效率,是确保方管冲击仿真结果可靠性的基石。

salt的博客 625

算法实操:Python代码实现直插排序(含有序在前和有序在后)

【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……   自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。             —— 华罗庚 My 优快云主页、My HOT博、My Python 学习个人备忘录 好文力荐、 老齐教室 算法实操: Python代码实现直插排序 (含

m0_57158496的博客 1209

【YOLO系列】YOLOv4详解:模型结构、损失函数、训练方法及代码实现

摘要:YOLOv4在目标检测领域实现了精度与速度的平衡,通过CSPDarknet53骨干网络、SPP+PANet特征融合及CIoU损失函数等创新,在MS COCO数据集达到65.7% AP50,V100显卡实现62FPS实时检测。核心优化包括Mosaic数据增强、自对抗训练和解耦头结构,显著提升小目标检测和遮挡场景鲁棒性。代码实现采用CSP模块和SPP多尺度池化,兼顾计算效率与检测性能,为工业落地提供高效解决方案。(149字)

一碗白开水一 1357

一步步带你用C#开发Modbus通信上位机(附完整代码与工程思路)

Modbus上位机开发指南(C#实现) 本文详细介绍使用C#开发Modbus上位机系统的全过程,覆盖RTU和TCP两种协议。内容包含:1)需求分析与技术选型(WinForms+NModbus4);2)分层架构设计(UI/业务/通信层);3)通信层核心代码实现(串口/以太网连接、数据读写);4)功能模块开发(设备管理、数据采集、远程控制)。提供可直接复用的Modbus RTU客户端代码示例,包含连接管理、线圈读写、寄存器操作等工业场景必备功能。通过系统化的开发流程,帮助开发者快速构建稳定可靠的Modbus监控

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 819

Python实现插入排序

Python实现插入排序 一、插入排序简介 插入排序(Insertion Sort),也被称为直接插入排序,是一种常见的排序算法。 插入排序是将元素列表中未排序的数据依次插入到有序序列中。从元素列表的第一个数据开始(将第一个数据视为已排序序列),按顺序将后面未排序的数据依次插入到前面已排序的序列中。对每一个未排序数据进行插入,是将该数据依次与相邻的前一个数据进行比较,如果顺序错误则交换位置,直到不需要交换则该数据插入完成。 插入排序的原理类似于玩扑克牌时,手动抓牌和排序,每抓一张新牌都按顺序插入到已有的牌中

csh2388827741的博客 5785

什么是信噪比?信噪比越大好还是越小好?

在进行声音增强的时候,往往需要考虑声音信号和噪声的信噪比,那么信噪比是什么呢?越大越好还是越小越好,此处引入百度百科的解读: 信噪比,英文名称叫做SNR或S/N(SIGNAL-NOISE RATIO),又称为讯噪比。是指一个电子设备或者电子系统中信号与噪声的比例。这里面的信号指的是来自设备外部需要通过这台设备进行处理的电子信号,噪声是指经过该设备后产生的原信号中并不存在的无规则的额外信号(或信息),并且该种信号并不随原信号的变化而变化。 同样是“原信号不存在”还有一种东西叫“失真”,失真和噪声实际上有一

码匀的博客 7万+

【算法】插入排序及其Python实现

插入排序思想 思路形象记忆: 假设索引0在左边,则: 每论排序后得到一个最小值; 插入其实就是把未排序的数字中最小值插入到左边已经排序的后面 代码实现要注意的地方 代码 参考:Python 插入排序 ...

Vincent Lai的博客 338

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

几种排序算法及其Python实现-插入排序①

几种排序算法及其Python实现 插入排序 直接插入排序 O(n²) 直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。 def InsertSort(L = None): j = 0 x = 0 for i in range(1, len(L)): if L[i] &lt; L[i-...

nicerWu的博客 427

visio安装包

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

排序算法介绍讲解(冒泡排序,插入排序,选择排序,归并排序,快速排序,堆排序)及其Python代码实现

排序 基于比较的排序算法的执行过程,会涉及两种操作,一种是元素比较大小,另一种是元素交换或移动。所以,如果我们在分析排序算法的执行效率的时候,应该把比较次数和交换(或移动)次数也考虑进去。 1 冒泡排序 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。 Python代码实现如下: def bubble(arr): # 遍历所有的元素 for i in range(len(arr)): # 比对还未排

qq_35549634的博客 624

经典算法 之 折半插入排序 python实现

本文介绍了排序的概念,折半插入排序的算法原理,并给出了python实现。

FFTang的博客 663

python-插入排序

边学边记录

weixin_43865160的博客 598

插入排序-Python实现

插入排序

0928 496

python实现算法改进_浅谈插入排序算法在Python程序中的实现及简单改进

Python实现插入排序的一般范例为:#coding=cp936#coding=cp936#插入排序算法def InsertionSort(A):for j in range(1,len(A)):key = A[j]i = j-1#向前查找插入位置while i>=0 and A[i]>key:A[i+1] = A[i]i = i-1A[i+1] = key#初始化输入数据A = []...

weixin_34052529的博客 221

python的插入排序实现

#!/usr/bin/env python # -*- coding: utf-8 -*- # Author:Richard_Kong """ 插入排序算法: 是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已经排序的数据序列中 从后向前扫描,找到相应的位置并插入。插入排序在实现上,需要反复把已经排序的元素逐步向后挪位,为最新元素提供插入空间 """ def in...

kokodudu的专栏 221

Python--实现插入排序(从小到大排序)

插入排序 算法原理: 从列表中第二个元素开始依次向前比较,从小到大排列,如果比较的数比被比较的数数值小,那么两个元素交换位置。 算法实现过程: 代码的实现 list = [5,3,9,7,4] for i in range(1,len(list)): for j in range(i,0,-1): if list[j]<list[j-1]: ...

qq_41604379的博客 4409

用python实现插入排序

一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除

Allen_by的博客 796

数据结构&算法实践—【排序|插入排序】插入排序

转载请注明出处:http://blog.youkuaiyun.com/wklken 回主目录 排序>>选择排序>>选择排序 List: 0.概念+示例分析 1.插入排序实现 0 start 基本概念: 维基百科http://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5

wklken的笔记 4973

Python:插入排序

插入排序是一种稳定的排序方式,最好O(n),最坏、平均O(n2),空间复杂度O(1) def insert_sort(lists): lens = len(lists) for i in range(1,lens): key = lists[i] j = i-1 while j>=0: if lists[j]>key: lists[j+1] = lists...

陈小q的博客 191

插入排序算法

插入排序算法 插入排序算法可以对指定序列完成升序(从小到大)或者降序(从大到小)排序,对应的时间复杂度为O(n2)。 插入排序算法的实现思路是:初始状态下,将待排序序列中的第一个元素看作是有序的子序列。从第二个元素开始,在不破坏子序列有序的前提下,将后续的每个元素插入到子序列中的适当位置。 举个简单的例子,用插入排序算法对 {14, 33, 27, 10, 35, 19, 42, 44} 实现升序排序的过程如下: 将第一个元素 14 看作是一个有序的子序列 {14},将剩余元素逐个插入到此序列的适当位置:

ccc369639963的博客 1568

python 排序_python实现·十大排序算法之插入排序(Insertion Sort)

简介 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 算法实现步骤 从第一个元素开始,该元素可以认为已经被排序;取出下一个元素,在已经排序的元素序列中从后向前扫描;如果该元素(已排序)大于新元素,将该元素移到下一位置;重复步骤3,直到找到已排序的元素小于或者等于新元素的位置...

weixin_39645308的博客 439
上一篇: 【数据结构】排序算法时间效率、空间效率以及算法稳定性总结
下一篇: sql语句的几个常用函数总结
haha_point
博客等级 码龄11年 52粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值