排序算法:插入排序(insert sort)

292 阅读2分钟

1/概念及其介绍

插入排序(InsertionSort),一般也被称为直接插入排序。

从index=1这个元素开始遍历,也就是从第二个元素开始,一直到最后一个元素,依次把元素放在恰当的位置。
分为2步:
   <1>先给某个元素找到合适的位置
   <2>把元素插入到这个位置
   
对于少量元素的排序,它是一个有效的算法。
插入排序是一种最简单的排序方法,它的基本思想是将一个元素插入到`已经排好序`的列表中,
这样一个新的、记录数增加1的有序列表就诞生了。

在实现过程使用双层循环:
   外层循环从第二个元素开始遍历
   内层循环对当前元素前面有序表进行待插入位置查找,并进行移动,
   (及找到最合适的位置,然后把元素插入进去)

2/适用说明

插入排序的平均时间复杂度也是O(n^2),空间复杂度为常数阶O(1),
(不需要另外开辟空间来存储数据,所示0(1))
具体时间复杂度和数组的有序性也是有关联的。

插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较N-1次,时间复杂度为O(N)。

最坏的情况是待排序数组是逆序的,此时需要比较次数最多,最坏的情况是O(n^2)。

3/过程图示

假设前面n-1(其中 n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,
然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。

按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。

从小到大的插入排序整个过程如图示:

4/插入排序代码

import random

# 构建一个有20个元素的无需列表
temp_list = []
for i in range(20):
    temp_list.append( random.randint(1,20) )
    
def insert_sort(temp_list):
    n = len(temp_list)
    
    if n <= 1:
        return temp_list
    
    # 从1开始,代表是从第二个元素开始,一直到最后一个元素,i是下标,index=1是第二个元素
    for i in range(1,n): 
        current_value = temp_list[i]  # 当前待插入的元素
        pre_index = i - 1 # 前一个元素的索引
        
        # 为待插入的元素(current_value)寻找合适的位置
        while pre_index >= 0 and temp_list[pre_index] > current_value:
            temp_list[pre_index+1] = temp_list[pre_index]  #把大的元素的位置往后移
            pre_index -= 1
        
        # 最后把待插入元素插入到合适的位置
        temp_list[pre_index+1] = current_value
   
   return temp_list

if __name__ == "__main__":
    result = insert_sort(temp_list)
    print(result)