直接插入排序

  • 地位

    • 最简单的插入排序
  • 过程
    • 每趟排序将一个新元素插入到有序序列的合适位置。
    • 算法
      • 数据为D0,D1,D2,,,Dn。初始状态,不妨将第一个元素D0看做当前有序序列的唯一一个元素。
      • 依次将D1,D2,D3插入到这个有序序列中,显然,扫描这n-1个元素是一个外部循环。
      • 下面进行插入过程,显然,当我去为Di寻找合适位置插入时,前i-1个元素一定有序,此时将Di与D0到Di-1进行比较,找寻插入位置,显然,这是一个内部循环。(当然,寻找插入位置一般从后向前找,也就是从Di-1找到D0)
  • 优化

    • 复杂度

      排序名称 最好情况 最坏情况 平均情况
      直接插入排序 O(n) O(n^2) O(n^2)
    • 不难看出,当数据正序时(或者说数据符合想要达到的排序结果)排序效率最高(因为每次插入前面的元素不需要后移),当数据反序时排序效率最低(每次插入前面数据都要后移)。

    • 优化思路很简单,我要找寻的这个插入位置其实是在有序序列一一比较的,然而对有序序列而言其实有更快的方法进行查找,这就是二分查找法。
"""
本模块实现一位数据的直接插入排序及其优化
"""def insertSort(data=[0, 1, 2, 3, 4, 5]):for i in range(1, len(data)):# 从下标1开始记录每一个待排元素temp = data[i]# 从当前元素的前一个元素开始进行合适位置查找j = i - 1while j >= 0 and temp < data[j]:# 循环直到序列第一个值或者找到一个元素比它小,循环内不断将元素向后交换data[j+1] = data[j]j -= 1data[j+1] = tempprint(data)def binarySearch(inputData, endIndex, value):''':param inputData: 数据集:param endIndex: 查找结束位置:param value: 查找的值:return:'''left = 0right = endIndex - 1while left <= right:middle = left + (right-left) // 2if inputData[middle] >= value:right = middle - 1else:left = middle + 1return left if left < endIndex else -1def insertSortOptimized(data=[0, 1, 2, 3, 4, 5]):for i in range(1, len(data)):j = i - 1temp = data[i]insertIndex = binarySearch(data, i, data[i])if insertIndex != -1:while j >= insertIndex:data[j+1] = data[j]j -= 1data[j+1] = tempprint(data)if __name__ == '__main__':testData1 = [1, 2, 3, 5, 4, 0]insertSort(data=testData1)insertSortOptimized(testData1)

具体可以查看我的github。

排序算法-02直接插入(python实现)相关推荐

  1. 【代码刷题】排序算法总结(python实现)

    排序算法总结(Python实现) 算法介绍 算法分类 相关概念 1. 冒泡排序(Bubble Sort) 1.1 思想 1.2 python实现 1.3 复杂度 1.4 稳定性 2. 快速排序(Qui ...

  2. 经典排序算法总结与Python实现(下)

    在之前的博客经典排序算法总结与Python实现(上)中已经讨论过插入.冒泡.选择.快排.谢尔排序.这篇博客主要完成剩下的几个排序算法. 排序算法 时间复杂度(最好) 时间复杂度(最差) 时间复杂度(平 ...

  3. 经典排序算法总结与Python实现(上)

    本篇博客中的有序都是指的升序,降序情况稍微改改就出来了. 排序算法 时间复杂度(最好) 时间复杂度(最差) 时间复杂度(平均) 空间复杂度 稳定性 插入排序 O(n)O(n)O(n) O(n2)O(n ...

  4. 十大经典排序算法1(Python版本)

    文章目录 一.排序算法与时间复杂度 二.冒泡排序 一.排序算法与时间复杂度 1.十大排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次 ...

  5. 十大经典排序算法6(Python版本)

    文章目录 九.桶排序 十.基数排序 九.桶排序 1.桶排序介绍 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.为了使桶排序更加高效,我们需要做到这两点: 在 ...

  6. 十大经典排序算法5(Python版本)

    文章目录 七.堆排序 八.计数排序 七.堆排序 1.堆排序介绍 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键 ...

  7. 十大经典排序算法4(Python版本)

    文章目录 六.快速排序 六.快速排序 1.快速介绍 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较.在最坏状况下则需要 Ο(n2) 次比较,但这 ...

  8. 十大经典排序算法3(Python版本)

    文章目录 四.希尔排序 五.归并排序 四.希尔排序 1.希尔介绍 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.但希尔排序是非稳定排序算法. 希尔排序是基于插入排序的以下两点性质而 ...

  9. 十大经典排序算法2(Python版本)

    文章目录 二.选择排序 三.插入排序 二.选择排序 1.选择介绍 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度.所以用到它的时候,数据规模越小越好.唯一的好处可能就 ...

最新文章

  1. iOS 让UIView的左上角和右上角为圆角
  2. 【文本分类】基于类信息的TF-IDF权重分析与改进
  3. 学习机器学习,究竟是理论重要,还是公式推导重要?
  4. Android广播的学习和使用
  5. Linux常见的发行版SUSE、Ubuntu、RedHat、CentOS、Fedora的联系和区别
  6. easycode 表配置_EasyCode插件使用及模板参考
  7. python encodings模块_python-ImportError:没有名为“ encodings”的模块
  8. mysql +hive 安装
  9. 43.Linux/Unix 系统编程手册(下) -- 进程间通信简介
  10. matlab选择语句函数,Matlab基本语句和基本函数
  11. I - 数塔(动态规划)数塔问题
  12. 【洛谷P1507 NASA的食物计划】动态规划
  13. php gd2扩展_PHP如何打开gd2扩展库
  14. 企业管理系统可视化权限功能设计
  15. java 音频波形图_java读取wav文件(波形文件)并绘制波形图的方法
  16. ubuntu和kubuntu换源
  17. 二分法的适用范围及通用代码
  18. LeetCode | 347. Top K Frequent Elements
  19. 物联网大咖华山论剑,MVP学院打造高端成长营
  20. android到底要多少内存,手机内存究竟要多大才够用?

热门文章

  1. 什么时候会触发这个策略呢?
  2. 茅塞顿开:Spring Aware原理解析
  3. Response_案例1_重定向_特点
  4. 数据类型介绍和表的创建
  5. SpringBoot高级消息-RabbitMQ运行机制
  6. SpringBoot_web开发-webjars静态资源映射规则
  7. Linux下Mysql设置外网可以访问
  8. 事件冒泡及阻止事件冒泡 事件的触发 事件参数对象 获取用户按下键盘的键
  9. 解决Tomcat下IntelliJ IDEA报错java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener
  10. linux 基本指令