这篇博文用来介绍直接插入排序

直接插入排序基本思想:

每次将一个待排序的记录插入到已经排好序的数据区中,直到全部插入完为止

直接插入排序算法思路:

在直接插入排序中,数据元素分为了有序区和无序区两个部分,在这里我们将列表左边部分作为有序区,列表右边部分作为无序区,有序区和无序区的大小是随着排序的进行而变化的。

如最开始列表是无序的,所以有序区长度为1,无序区长度为列表长度-1,排序结束后,列表变为有序,则有序区长度为列表长度,无序区长度为0.

具体步骤为:

排序过程中每次从无序区中取出第一个元素,将它插入到有序区中的适当位置(即该元素放在此位置,有序区仍然有序),使之成为新的有序区,重复n-1次可完成排序过程。

假设需要将列表从小到大排序

想要将从无序区中取出的第一个元素temp插入到有序区中的适当位置,需要有一个循环遍历的过程,即从该元素位置处依次向前比较,会有两种情况:

  1,前面的元素waitsortlist[j-1]大于temp,则temp需要继续向前比较,同时大于temp的元素需要后移一位

  2,前面的元素waitsortlist[j-1]小于等于temp,则temp不需要继续比较了,因为temp大于有序区中最大的元素,有序区伸展一位,包含temp

另外还需要考虑 j 的边界问题,因为会用到 j-1,所以 j 需要>=1防止越界,对于无序区某一个元素temp的直接插入代码如下:

        temp=waitsortlist[j]
while j>=1:
if temp<waitsortlist[j-1]:
waitsortlist[j]=waitsortlist[j-1]
j=j-1
else:
break
waitsortlist[j]=temp

 外层是一个列表的遍历,加上上面的代码为:

 

    i=0
j=i+1
while j<len(waitsortlist):
temp=waitsortlist[j]
while j>=1:
if temp<waitsortlist[j-1]:
waitsortlist[j]=waitsortlist[j-1]
j=j-1
else:
break
waitsortlist[j]=temp
i=i+1
j=i+1

  可以看出,列表的第一个元素必为有序区,遍历的过程中不断扩大有序区的范围,对于列表某一个元素来说,就是将其插入在有序区中适当的位置,外层循环遍历结束后,有序区也扩充为列表长度,即排序结束。

该算法的时间复杂度为O(n^2),因为有两层循环,时间开销比较大,空间复杂度为O(1),只是用了常数阶的空间来存储变量,用以直接插入排序

全部代码为(实际上看了前面的相信你已经能写出来了:D

'''
直接插入排序
'''
def DirectInsertionSort(waitsortlist):
i=0
j=i+1
while j<len(waitsortlist):
temp=waitsortlist[j]
while j>=1:
if temp<waitsortlist[j-1]:
waitsortlist[j]=waitsortlist[j-1]
j=j-1
else:
break
waitsortlist[j]=temp
i=i+1
j=i+1
return waitsortlist if __name__=='__main__':
waitsortlist=[9,8,7,6,5,4,3,2,1,0]
print(DirectInsertionSort(waitsortlist))

  运行结果为:

直接插入排序 (带监视哨):

哨兵的概念:一切为简化边界条件而引入的附加结点(元素)均可称为哨兵。

在上面的代码我们可以看到有这一段:

while j>=1:

  内循环每一次比较前都需要判断 j 是否越界,有没有不需要判断的办法呢?当然有,这就是哨兵的作用

将上面的代码改为:

def DirectInsertionSortEye(waitsortlist):
i=1
j=i+1
while j<len(waitsortlist):
temp=waitsortlist[j]
waitsortlist[0]=temp
while temp<waitsortlist[j-1]:
waitsortlist[j]=waitsortlist[j-1]
j=j-1
waitsortlist[j]=temp
i=i+1
j=i+1
return waitsortlist if __name__=='__main__':
waitsortlist=[0,9,8,7,6,5,4,3,2,1,0]
print(DirectInsertionSortEye(waitsortlist))

  输出的结果为:

我们将waitsortlist[0]设置为哨兵,传入列表的时候,该位置也不能够放置有效元素,用列表一个元素的空间判断越界与否的比较时间。可以看出,一次循环少判断一次,n次循环少判断n次,当数据量较大时,很明显是优于不带监视哨的直接插入排序。

带监视哨的直接插入排序思想也很简单,在原有基础上稍加修改即可,这里不再赘述。

直接插入排序(python实现)的更多相关文章

  1. 插入排序-Python与PHP实现版

    插入排序Python实现 import random a=[random.randint(1,999) for x in range(0,36)] # 直接插入排序算法 def insertionSo ...

  2. 插入排序——Python实现

    插入排序Python实现 # -*- coding: utf-8 -*- # @Time : 2019/10/28 20:47 # @Author : yuzhou_1shu # @Email : y ...

  3. 插入排序——Python实现

    一.排序思想 排序思想参见:https://www.cnblogs.com/luomeng/p/10583124.html 二.python实现 def InsertSort(arrs): " ...

  4. 插入排序-python实现

    def insert_sort(arr): for j in range(1,len(arr)):               #从list第二个元素开始 key=arr[j]             ...

  5. 插入排序--python

    import random def insert_sort(nums): # 排序趟数 for i in range(1, len(nums)): current = nums[i] pre_inde ...

  6. [算法导论]插入排序 @ Python

    class insertionsort(): def insertion_sort(self,Array): for i in range(1, len(Array)): key = Array[i] ...

  7. 几种排序算法的学习,利用Python和C实现

    之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...

  8. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  9. 十大经典排序算法(python实现)(原创)

    个人最喜欢的排序方法是非比较类的计数排序,简单粗暴.专治花里胡哨!!! 使用场景: 1,空间复杂度 越低越好.n值较大: 堆排序 O(nlog2n) O(1) 2,无空间复杂度要求.n值较大: 桶排序 ...

  10. 十大经典算法 Python实现

    十大经典排序算法(python实现)(原创) 使用场景: 1,空间复杂度 越低越好.n值较大: 堆排序 O(nlog2n) O(1) 2,无空间复杂度要求.n值较大: 桶排序 O(n+k) O(n+k ...

随机推荐

  1. C++常见的面试题目整理

    本文列出C++面试中经常遇到的一些问题,都是一些常见的面试考点,如果后续遇到其他常见面试问题还会再次更新.希望对近期参加面试的同学有一些帮助.先后顺序与问题的重要性无关,查看的时候,最好是全面了解一下 ...

  2. Cocos Creator与VS Code整合代码提示问题

    Cocos Creator与VS Code整合开发配置 在Cocos Creator中依次点击下面框中的菜单 VS Code工作流 配置Cocos Creator的默认编辑器 Cocos Creato ...

  3. python_udp_多人聊天室_简单版

    udp-一定是client端先发送数据. server.py import socket friend_lst = {'alex':'32','太白':'33'} sk =socket.socket( ...

  4. 手写atoi、strcpy、strcat

    一:实现atoi函数 1 #include<iostream> 2 3 using namespace std; 4 5 int atoi_my(const char *str) 6 { ...

  5. select的限制

    /*一.select实现并发服务器并发的两点限制 1.一个进能够打开的最大文件描述符限制.可以通过两种方式修改 ulimit -n :获取最大文件描述符个数 ulimit -n 2048:修改为204 ...

  6. java服务器部署开源项目(若依)

    1准备工作 (1)阿里云 centos_8_0_x64_20G_alibase_20200218.vhd [root@iZ2zeeqw5fxmm9zagf439aZ ~]# cat /etc/redh ...

  7. 你要的SSM(Spring+Springmvc+Mybatis)小项目来了!!!

    SSM-Maven-Heima 这是一个使用 SSM(Spring+Springmvc+Mybatis)框架的商城小项目,使用Maven构建项目,以MySQL为数据库系统,Redis的缓存服务器(并不 ...

  8. 3-colorability

    目录 1.1 3-colorability 1.1.1 3元可满足规约到3着色 1.1.2 证明充分和必要性 1.1 3-colorability 一个图的三着色问题:要使得边两头的结点颜色互不相同. ...

  9. day02-业务服务监控

    提供大量第三方工具,可以开发企业级服务监控平台,本章涉及文件与目录差异对比.HTTP质量监控.邮件告警等内容一.文件内容差异比对1.示例1 d = difflib.Differ() diff = d. ...

  10. 使用大乌龟git和码云搭建版本库

    刚刚过完清明,上班的第一天,大佬跟我说,要用码云和git搭建一个版本库,菜鸡的博主楞了半天,然后赶紧上网找资料,此时,一旁的大佬已经看不下去了,终于,出手了....... 1. 首先,先把大乌龟git ...