dangdangA

导航

排序算法之插入排序

插入排序


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)

 

输出结果:

 

posted on 2020-02-18 22:15  dangdangA  阅读(141)  评论(0编辑  收藏  举报