一、前言
直接插入排序(Insertion Sort)序是一种最简单的插入排序。为简化问题,我们下面只讨论升序排序。

二、算法思想
插入排序:每一趟将一个待排序的记录,按照其关键字的大小插入到有序队列的合适位置里,直到全部插入完成。

假设有一组无序序列 R0, R1, ... , RN-1。

(1) 我们先将这个序列中下标为 0 的元素视为元素个数为 1 的有序序列。

(2) 然后,我们要依次把 R1, R2, ... , RN-1 插入到这个有序序列中。所以,我们需要一个外部循环,从下标 1 扫描到 N-1 。

(3) 接下来描述插入过程。假设这是要将 Ri 插入到前面有序的序列中。由前面所述,我们可知,插入Ri时,前 i-1 个数肯定已经是有序了。

所以我们需要将Ri 和R0 ~ Ri-1 进行比较,确定要插入的合适位置。这就需要一个内部循环,我们一般是从后往前比较,即从下标 i-1 开始向 0 进行扫描。

代码

# -*- coding:utf-8 -*-def insertSort(input_list):if len(input_list) == 0:return []sorted_list = input_listfor i in range(1, len(sorted_list)):temp = sorted_list[i]j = i - 1while j >=0 and temp < sorted_list[j]:sorted_list[j + 1] = sorted_list[j]j -= 1sorted_list[j + 1] = tempreturn sorted_listif __name__ == '__main__':input_list = [6, 4, 8, 9, 2, 3, 1]print('排序前:', input_list)sorted_list = insertSort(input_list)print('排序后:', sorted_list)

三、算法分析
1、直接插入排序的算法性能

2、时间复杂度

当数据正序时,执行效率最好,每次插入都不用移动前面的元素,时间复杂度为O(N)

当数据反序时,执行效率最差,每次插入都要前面的元素后移,时间复杂度为O(N^2)

所以,数据越接近正序,直接插入排序的算法性能越好。

3、空间复杂度

由直接插入排序算法可知,我们在排序过程中,需要一个临时变量存储要插入的值,所以空间复杂度为 1 。

4、算法稳定性

直接插入排序的过程中,不需要改变相等数值元素的位置,所以它是稳定的算法。

四、优化

因为在一个有序序列中查找一个插入位置,以保证有序序列的序列不变,所以可以使用二分查找,减少元素比较次数提高效率。

二分查找是对于有序数组而言的,假设如果数组是升序排序的。那么,二分查找算法就是不断对数组进行对半分割,每次拿中间元素和目标数字进行比较,如果中间元素小于目标数字,则说明目标数字应该在右侧被分割的数组中,如果中间元素大于目标数字,则说明目标数字应该在左侧被分割的数组中。

代码

# -*- coding:utf-8 -*-def BinarySearch(input_list, end, value):left = 0right = end - 1while left <= right:middle = left + (right - left) // 2if input_list[middle] >= value:right = middle - 1else:left = middle + 1return left if left < end else -1def BinaryInsertSort(input_list):if len(input_list) == 0:return []result = input_listfor i in range(1, len(input_list)):j = i - 1temp = result[i]insert_index = BinarySearch(result, i, result[i])if insert_index != -1:while j >= insert_index:result[j + 1] = result[j]j -= 1result[j + 1] = tempreturn resultif __name__ == '__main__':input_list = [6, 4, 8, 9, 2, 3, 1]print('排序前:', input_list)sorted_list = insertSort(input_list)print('排序后:', sorted_list)

排序(2):直接插入排序相关推荐

  1. 希尔排序(缩小增量排序)(插入排序的优化版) C++代码实现及算法分析 恋上数据结构笔记

    文章目录 复习概要 算法思想 算法流程 算法复杂度分析及稳定性 希尔排序代码正常版 希尔排序与插入排序代码对比 希尔排序个人青春版(别看以免走上歧途) 复习概要 算法思想与流程 分这么多组分别插入排序 ...

  2. 排序算法 | 直接插入排序算法的图解、实现、复杂度和稳定性分析

    排序算法 | 直接插入排序算法的图解.实现.复杂度和稳定性分析 目录 1.直接插入排序定义 2.直接插入排序,步骤说明 3.动态图演示 4.代码实现,运行结果 5.算法分析 ① 时间复杂度分析 ② 空 ...

  3. JavaSE(二十四)——冒泡排序、选择排序、直接插入排序以及二分查找

    文章目录 1. 冒泡排序 2. 选择排序 3. 直接插入排序 4. 二分查找 1. 冒泡排序 原理:数组元素两两比较,大的往后放,经过一轮比较后,最大元素在最后面,如此往复. 举例说明: 代码: // ...

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

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

  5. Java常见排序算法之插入排序

    一.概述 本节由小千给大家分享Java常见排序算法之插入排序,之前我们说过排序是算法中的一部分.所以我们学习排序也是算法的入门,为了能让大家感受到排序是算法的一部分,我举个例子证明一下:比如麻将游戏, ...

  6. 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...

    掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等). 数组高级以及Arrays(掌握) 排序方法 空间复杂度 时间复杂度 稳定性 插 入 排 序 ...

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

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

  8. 插入排序 php,常用的排序算法(二)--插入排序(PHP实现)

    常用的排序算法系列 插入排序 插入排序是一种逻辑上非常好理解的排序方式,整个排序的核心就是不断在当前已经排好部分数据的数组里,找到合适的位置插入新数据.就像抓扑克牌,抓一张,然后再手里已经部分已经排好 ...

  9. 排序算法(2)----插入排序

    这篇博客分为三部分: 排序思想 代码实现与解析 一次优化(简化代码) 二次优化(提高性能,并且看上去更加舒服) 一.排序思想 * 2) * [插入排序]:(从小到大) * 1.找到待排数组的第一个元素 ...

  10. 插入排序算法 java_排序算法实现-插入排序(Java版本)

    原标题:排序算法实现-插入排序(Java版本) 插入排序(英语:Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到 ...

最新文章

  1. 熔断的意义和适用场景,你真的清楚吗?
  2. youtube获取播放列表信息
  3. CodeForces - 670C Cinema(离散化+排序/map,水题)
  4. java创建子类对象的步骤_一顿Spring骚操作:我敢说没有人比我更懂Java对象的创建!
  5. cannot find -lunwind-x86_64
  6. Java Enum学习总结
  7. Python中的类属性和实例属性以及静态方法和类方法
  8. python 读取、写入 pkl文件
  9. 一步一步写算法(之循环和递归)
  10. antd权限管理_Ant Design Pro开发后台管理系统(权限)-阿里云开发者社区
  11. SpringSecurity-1-AuthenticationFailureHandler接口(登录失败之后的处理逻辑)
  12. 在一线城市做Java开发如何月薪达到两万,需要技术水平达到什么程度?
  13. python二级多少分过_计算机二级分值分配 多少分及格
  14. minimax算法(井子棋)
  15. 计算机电脑用户名,如何改计算机用户名(administrator)
  16. maven发布SNAPSHOT版本到私服仓库
  17. valid ready协议学习
  18. 恶意代码检测c语言,恶意代码检测分析软件
  19. html 如何去掉超链接下的下划线
  20. 软件安全学习笔记(7):PE文件总体格式

热门文章

  1. 鸿蒙os智能座舱,华为智能座舱的野心:HiCar上车,为鸿蒙OS铺路
  2. vb.net 判断是否为ip 正则_什么是个人IP科学定位?标准答案来了|ip|直播|科学|ip魔方...
  3. c oracle日志分析,oracle 日志分析
  4. Selenium POM简介
  5. python嵌套列表索引 index_Python:嵌套lis中元素的索引列表
  6. mysql id div 1000000_Mysql数据自动ID编号,如何解决?
  7. php html 停止工作,换行符php和html无法正常工作
  8. matlab+adst,SPC572L64E3 - 用于汽车动力系统应用的32位Power Architecture MCU - STMicroelectronics...
  9. Part Ⅱ At the Restaurant 在饭店??
  10. 《天天数学》连载25:一月二十五日