【算法】插入排序

  插入排序的大体思路就是一开始会将未排序的数据分为两部分,一部分是已排序的数组,另一部分是未排序的数组。然后将未排序数组中的第一个元素挑出来,和前面已排序的数组进行比较,插入合适的位置。依此进行,直到未排序数组为空。

  例如:待排序的数组为[4, 5,6,1,3,2], 一开始  一排序的数组为[ 4 ], 未排序的数组未 [ 5, 6, 1, 3, 2]。然后从元素5开始选择在排序数组中的插入位置, 完毕之后,排序数组变为[4,5], 未排序的数组变为[ 6, 1, 3, 2]。然后继续执行之前的操作。

  

  实现代码:

 1 def insert_sort(arry):
 2     if len(arry) < 2:           # 当数组中元素小于2 时直接返回。
 3         return arry
 4 
 5     for i in range(1, len(arry)):    # 从未排序数组中第一个开始。
 6         index = arry[i]              #记录第一个元素的值
 7         j = i-1
 8         while j >= 0:           
 9             if arry[j] > index:      # 如果排序数组中第j和元素大于该元素, 则将其向后移动一位。
10                 arry[j+1] = arry[j]
11             j -= 1
12         arry[j+1] = index            # 将index的值复制到相应的位置。

  分析:

  稳定性分析: 当在排序过程中,只有当排序数组中元素大于当前未排序数组中元素时,才会向后移动,这保证了如果两个相等的元素进行比较,这不会导致元素向后移动,会直接在当前位置进行插入。这意味者插入排序是稳定算法。并且为原地排序。

  时间复杂度和空间复杂度分析:插入排序在最好的情况下时间复杂度为O(n)(已经是有序的), 而最坏的情况下为O(n2)。 但是大部分情况下,都不会直接有序。而平均时间复杂度为O(n(n+1)/4)省去系数为O(n2)。空间复杂度为O(1)。

猜你喜欢

转载自www.cnblogs.com/GoodRnne/p/10598865.html