zoukankan      html  css  js  c++  java
  • 排序算法之插入排序

    插入排序


    1.时间复杂度:
            最优时间复杂度:O(n)
            最坏时间复杂度:O(n2)


    2.稳定性:稳定


    3.插入排序举例:
    alist = [93,     54,77,31,44,55,226] j = 1,i = 1开始
    当i = 1时,判断54和93的大小关系(即 i=1 和 i= 0 位置的大小关系),此时54应该放在93之前的位置,即alist = [54,93,    77,31,44,55,226]
    alist = [54,93,    77,31,44,55,226] j = 2,i = 2开始
    当i = 2时,判断77和93的大小关系(即 i=2 和 i= 1 位置的大小关系),此时77应该放在93之前的位置,即alist = [54,77,93    31,44,55,226]
    当i = 1时,判断77和54的大小关系(即 i=1 和 i= 0 位置的大小关系),此时不改变77和54的位置,即alist = [54,77,93    31,44,55,226]
    alist = [54,77,93,   31,44,55,226]  j = 3,i = 3开始
    当 i = 3时,判断31和93的大小关系(即 i=3 和 i= 2 位置的大小关系),此时31应该放在93之前的位置,即alist = [54,77,31,93,     44,55,226]
    当 i = 2时,判断31和77的大小关系(即 i=2 和 i= 1 位置的大小关系),此时31应该放在77之前的位置,即alist = [54,31,77,93,     44,55,226]
    当 i = 1时,判断31和54的大小关系(即 i=1 和 i= 0 位置的大小关系),此时31应该放在54之前的位置,即alist = [31,54,77,93,     44,55,226]
    alist = [31,54,77,93,     44,55,226]  j = 4,i = 4开始
    当 i = 4时,判断44和93的大小关系(即 i=4 和 i= 3 位置的大小关系),此时44应该放在93之前的位置,即alist = [31,54,77,44,93,     55,226]
    当 i = 3时,判断44和77的大小关系(即 i=3 和 i= 2 位置的大小关系),此时44应该放在77之前的位置,即alist = [31,54,44,77,93,     55,226]
    当 i = 2时,判断44和54的大小关系(即 i=2 和 i= 1 位置的大小关系),此时44应该放在54之前的位置,即alist = [31,44,54,77,93,     55,226]
    当 i = 1时,判断44和31的大小关系(即 i=1 和 i= 0 位置的大小关系),此时不改变44和31的位置,即alist = [31,44,54,77,93,     55,226]
    alist = [31,44,54,77,93,     55,226] j = 5,i = 5开始
    当 i = 5时,判断55和93的大小关系(即 i=5 和 i= 4 位置的大小关系),此时55应该放在93之前的位置,即alist = [31,44,54,77,55,93,     226]
    当 i = 4时,判断55和77的大小关系(即 i=4 和 i= 3 位置的大小关系),此时55应该放在77之前的位置,即alist = [31,44,54,55,77,93,     226]
    当 i = 3时,判断55和54的大小关系(即 i=3 和 i= 2 位置的大小关系),此时不改变55和54的位置,即alist = [31,44,54,55,77,93,     226]
    后续循环不需要进行了
    alist = [31,44,54,55,77,93,     226] j = 6,i = 6开始
    当 i = 6时,判断226和93的大小关系(即 i=6 和 i= 5 位置的大小关系),此时不改变226和93的位置,即alist = [31,44,54,55,77,93, 226]
    后续循环不需要进行了

    4.Python代码实现:

     1 #coding:utf-8
     2 #insertion_sort:插入排序
     3 #插入算法:一部分是排序好的,另一部分是未排序的
     4 #第一轮:将列表的位置0处的元素作为初始的排序部分,其余的作为未排序部分
     5 #第二轮:将未排序部分的第一个元素与排序部分的元素进行比较替换,最终放置在排序部分应该在的位置
     6 #以此类推,进行n-1轮。
     7 
     8 def insertion_sort(alist):
     9     """插入排序"""
    10     n = len(alist)
    11     #从右边的无序序列中取出多少个元素执行这样的过程
    12     for j in range(1,n):
    13         # j = [1,2,3,...,n-1]
    14         # i 代表内层循环起始值
    15         i = j
    16         #内层循环代表的是执行从右边的无需序列中取出第一个元素即i位置的元素,然后将其插入到前面序列的正确位置中
    17         while i > 0:
    18             if alist[i] < alist[i-1]:
    19                 alist[i-1],alist[i] = alist[i],alist[i-1]
    20                 i -= 1
    21             else:
    22                 break
    23 
    24 
    25 if __name__ == "__main__":
    26     alist = [93,54,77,31,44,55,226]
    27     print("插入排序之前的原始列表:")
    28     print(alist)
    29     insertion_sort(alist)
    30     print("插入排序之后的列表:")
    31     print(alist)

    输出结果:

  • 相关阅读:
    C/S架构引用Lodop 如何在C#调用web打印控件Lodop
    Lodop打印设计(PRINT_DESIGN)里的快捷键
    Lodop打印控件中PRINT_INITA()和PRINT_PAGESIZE()宽高
    LODOP打印控件关联输出各内容
    如何判断使用的是Lodop还是C-Lodop
    Lodop代码设置打印机等信息后 设置预览可重选
    Lodop打印控件输出页码(超文本和纯文本页码)
    PhotoShop不用魔棒、钢笔 建立较平整的选区 P进电脑屏幕里
    uniq命令详解
    sort命令详解
  • 原文地址:https://www.cnblogs.com/xiaodangdang/p/12329076.html
Copyright © 2011-2022 走看看