排序算法-02直接插入(python实现)
直接插入排序
- 地位
- 最简单的插入排序
- 过程
- 每趟排序将一个新元素插入到有序序列的合适位置。
- 算法
- 数据为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实现)相关推荐
- 【代码刷题】排序算法总结(python实现)
排序算法总结(Python实现) 算法介绍 算法分类 相关概念 1. 冒泡排序(Bubble Sort) 1.1 思想 1.2 python实现 1.3 复杂度 1.4 稳定性 2. 快速排序(Qui ...
- 经典排序算法总结与Python实现(下)
在之前的博客经典排序算法总结与Python实现(上)中已经讨论过插入.冒泡.选择.快排.谢尔排序.这篇博客主要完成剩下的几个排序算法. 排序算法 时间复杂度(最好) 时间复杂度(最差) 时间复杂度(平 ...
- 经典排序算法总结与Python实现(上)
本篇博客中的有序都是指的升序,降序情况稍微改改就出来了. 排序算法 时间复杂度(最好) 时间复杂度(最差) 时间复杂度(平均) 空间复杂度 稳定性 插入排序 O(n)O(n)O(n) O(n2)O(n ...
- 十大经典排序算法1(Python版本)
文章目录 一.排序算法与时间复杂度 二.冒泡排序 一.排序算法与时间复杂度 1.十大排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次 ...
- 十大经典排序算法6(Python版本)
文章目录 九.桶排序 十.基数排序 九.桶排序 1.桶排序介绍 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.为了使桶排序更加高效,我们需要做到这两点: 在 ...
- 十大经典排序算法5(Python版本)
文章目录 七.堆排序 八.计数排序 七.堆排序 1.堆排序介绍 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键 ...
- 十大经典排序算法4(Python版本)
文章目录 六.快速排序 六.快速排序 1.快速介绍 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较.在最坏状况下则需要 Ο(n2) 次比较,但这 ...
- 十大经典排序算法3(Python版本)
文章目录 四.希尔排序 五.归并排序 四.希尔排序 1.希尔介绍 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.但希尔排序是非稳定排序算法. 希尔排序是基于插入排序的以下两点性质而 ...
- 十大经典排序算法2(Python版本)
文章目录 二.选择排序 三.插入排序 二.选择排序 1.选择介绍 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度.所以用到它的时候,数据规模越小越好.唯一的好处可能就 ...
最新文章
- iOS 让UIView的左上角和右上角为圆角
- 【文本分类】基于类信息的TF-IDF权重分析与改进
- 学习机器学习,究竟是理论重要,还是公式推导重要?
- Android广播的学习和使用
- Linux常见的发行版SUSE、Ubuntu、RedHat、CentOS、Fedora的联系和区别
- easycode 表配置_EasyCode插件使用及模板参考
- python encodings模块_python-ImportError:没有名为“ encodings”的模块
- mysql +hive 安装
- 43.Linux/Unix 系统编程手册(下) -- 进程间通信简介
- matlab选择语句函数,Matlab基本语句和基本函数
- I - 数塔(动态规划)数塔问题
- 【洛谷P1507 NASA的食物计划】动态规划
- php gd2扩展_PHP如何打开gd2扩展库
- 企业管理系统可视化权限功能设计
- java 音频波形图_java读取wav文件(波形文件)并绘制波形图的方法
- ubuntu和kubuntu换源
- 二分法的适用范围及通用代码
- LeetCode | 347. Top K Frequent Elements
- 物联网大咖华山论剑,MVP学院打造高端成长营
- android到底要多少内存,手机内存究竟要多大才够用?
热门文章
- 什么时候会触发这个策略呢?
- 茅塞顿开:Spring Aware原理解析
- Response_案例1_重定向_特点
- 数据类型介绍和表的创建
- SpringBoot高级消息-RabbitMQ运行机制
- SpringBoot_web开发-webjars静态资源映射规则
- Linux下Mysql设置外网可以访问
- 事件冒泡及阻止事件冒泡 事件的触发 事件参数对象 获取用户按下键盘的键
- 解决Tomcat下IntelliJ IDEA报错java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener
- linux 基本指令