简介

插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

算法实现步骤

从第一个元素开始,该元素可以认为已经被排序;

取出下一个元素,在已经排序的元素序列中从后向前扫描;

如果该元素(已排序)大于新元素,将该元素移到下一位置;

重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

将新元素插入到该位置后;

重复步骤2~5。

Python 代码实现# insertion_sort 代码实现

from typing import List

def insertion_sort(arr: List[int]):

"""

插入排序

:param arr: 待排序List

:return: 插入排序是就地排序(in-place)

"""

length = len(arr)

if length <= 1:

return

for i in range(1, length):

value = arr[i]

j = i - 1

while j >= 0 and arr[j] > value:

arr[j + 1] = arr[j]

j -= 1

arr[j + 1] = value

# 测试数据

if __name__ == '__main__':

import random

random.seed(54)

arr = [random.randint(0,100) for _ in range(10)]

print("原始数据:", arr)

insertion_sort(arr)

print("插入排序结果:", arr)

# 输出结果

原始数据: [17, 56, 71, 38, 61, 62, 48, 28, 57, 42]

插入排序结果: [17, 28, 38, 42, 48, 56, 57, 61, 62, 71]

动画演示

算法分析

时间复杂度

如果数据初始是顺序的,只需要外循环n-1次,每次进行一次比较,无需移动元素,即可完成。所需的比较次数$C$和记录移动次数$M$均达到最小值为:

$$

C_{\min}=n-1;

M_{\min}=0

$$

所以,插入排序最好的时间复杂度为$O\left( n \right)$。

如果数据初始是逆序的,则需要进行$n-1$趟排序,每次排序中待插入的元素都要和$\left[ 0,i-1 \right]$中的$i$个元素进行比较,并将这$i$个元素后移$i$次,每趟移动次数为$i+2$,此时比较和移动次数均达到最大值为:

$$

C_{\max}=1+2+3+\cdots +n-1=\frac{n\left( n-1 \right)}{2}=O\left( n^2 \right)

$$

$$

M_{\max}=2+3+4+\cdots +n=\frac{\left( n-1 \right) \left( n+2 \right)}{2}=O\left( n^2 \right)

$$

所以,平均时间复杂度为$O\left( n^2 \right)$。

空间复杂度

空间复杂度就是在交换元素时那个临时变量所占的内存空间,与数据规模无关,空间复杂度为$O\left( 1 \right)$

稳定性

排序过程中,相同元素的相对位置保持不变,所以插入排序属于稳定排序。

综合评价

联系我们

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

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

    简介 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法实现步骤 从第一个元素开 ...

  2. JAVA十大排序算法动画_十大排序算法(java实现)

    [前言]最近在重新研究算法,此篇博文供自己复习使用也为方便广大程序员同学!此文代码均为自己实现,通过对比经典解法校验,若有错请读者及时提出! - [对比分析图]首先,我们先来对比分析一下这十大排序算法 ...

  3. python排序算法实现_十大排序算法python实现

    进程和线程 进程和线程的主要差别在于它们是不同的操作系统资源管理方式.进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径.线程有自己的堆栈和局 ...

  4. 抢红包算法 c++_十大排序算法(一):冒泡排序法

    作者:绿皮长条瓜 目录 一.算法介绍 二.MATLAB实现 三.两个例子 一.算法介绍 冒泡排序(Bubble Sort)算法是一种计算科学领域的较简单的排序算法.它重复地走访过要排序的元素列,如果顺 ...

  5. 八十八、Python | 十大排序算法系列(下篇)

    @Author:Runsen @Date:2020/7/10 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  6. 八十七、Python | 十大排序算法系列(上篇)

    @Author:Runsen @Date:2020/7/10 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  7. 归并排序执行次数_十大排序算法,看这篇就够了

    排序算法分类[1][2] 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以 ...

  8. 【十大排序算法系列】快速排序

    写在前面 上一篇更新了这个系列的排序算法([十大排序算法系列]冒泡排序).分析了冒泡的逻辑和优化点,下面来写下快速排序(为什么跳这么快?因为比较走心hhhh) 照例给出系列内所有算法的对比.. 常见的 ...

  9. 【十大排序算法】(一)冒泡排序算法(优化)

    一.优化第一版 优化第一版是针对类似 int[] arr = {3,2,1,4,5,6,7,8,9; 这样的有很多已经排好序的数组,为了不让它做无用的循环,对于此场景进行的优化,优化代码如下: // ...

最新文章

  1. Python脱产8期 Day02
  2. Ubuntu 16.04下部署Graylog日志服务器
  3. Leetcode Permutation Sequence
  4. 58或与赶集合并,几人欢喜几人愁
  5. 使用适用于Java 2的AWS开发工具包的AWS DynamoDB版本字段
  6. Spark Core
  7. 代码精进之路--思维导图
  8. Slackware Linux 14.0 RC5 发布
  9. Struts2标签-checkbox只读属性设置
  10. 服务消费和负载(Feign)
  11. 机器学习实战——AdaBoost
  12. VS2012下基于Glut glRotatef glTranslatef示例程序:
  13. 关于微信小程序中uView中通过packer选择器修改表单无法触发form组件的表单验证的问题
  14. 利用后退按钮进行重复提交的解决办法。
  15. matlab2014a中输入中文显示不出来,显示的是方框
  16. Pandas学习——文本数据
  17. PokemonGo完美度算法!是风姐还是松岛枫?--工地斗天地斗天马座
  18. 无线射频专题《射频合规,无线电认证系列简介,IC/CE/FCC/NCC/KCC/SRRC/ROHS/TELET/REACH/ANATEL》
  19. 刷爆力扣之等价多米诺骨牌对的数量
  20. win 二进制门安装mysql_MySQL5.7 windows二进制安装教程

热门文章

  1. gitlab备份与恢复操作整理
  2. reactjs redux集中式状态管理最简入门案例
  3. 浏览器网页上的SSH终端webssh:pip install webssh
  4. 图解Spark On Yarn cluster模式运行机制
  5. 【收藏】ArcGIS 10.8 for Desktop 完整安装教程(含win7/8/10 32/64位+下载地址+亲测可用+汉化)
  6. 通过阿里云容器镜像服务海外服务器构建spark-operator镜像
  7. 如何删除 Windows.old 文件夹
  8. win10使用WSL安装CentOS7
  9. Docker中运行Springboot jar时的变量传递
  10. Scala集合:Set集合