排序算法之插入排序
插入排序
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)
输出结果: