经典排序算法3-插入排序(Python实现)

经典排序算法之插入排序

插入排序法(Insert Sort)是将数组中的元素逐一与已排序好的数据进行比较,前两个元素排序好,再将第三个元素插入适当的位置,所以这三个元素仍然是已排序好的,接着将第四个元素加入,重复以上步骤,直到排序完成为止。可以看作是在一串有序的记录R1、R2…Rn中插入新的记录,并使得n+1的数据依然排序妥当。
以下我们依然使用10, 8, 44, 9, 12, 37, 21, 5这几个元素来演示从小到大的排序过程:

  1. 首先我们假定元素10的位置是正确的,我们从第二个元素8开始与元素10比较,由于8<10成立,所以元素8需要插入到10前面,此时数组为:[8, 10, 44, 9, 12, 37, 21, 5]
  2. 基于以上,我们可以认为元素8与10已经放在了正确的位置,接着我们以第三个元素44与前两个元素比较,因为44<8,44<10均不成立,所以44无需向前插入,先放在当前的位置,此时数组为:[8, 10, 44, 9, 12, 37, 21, 5]
  3. 接下来从第四个元素开始,重复以上过程即可…

代码实现如下:

list_chaos = [10, 8, 44, 9, 12, 37, 21, 5]


def sort_insert(data):
    length = len(data)
    for i in range(1, length):
        tmp = data[i]  # 首先我们把要插入的元素的值保存在一个变量tmp里面
        j = i - 1  # 向前搜索
        while j >= 0 and tmp < data[j]:  # 找到满足条件的元素且不超过数组头
            data[j + 1] = data[j]  # 每向前越过一个元素即把相应元素往后移一位
            j -= 1  # 继续向前
        data[j + 1] = tmp  # 这里j+1是把循环跳出前多减掉的1加回来,并把插入元素的值赋给正确的插入位置
        print(data)


sort_insert(list_chaos)

插入排序法分析

  1. 最坏/平均情况均需比较(n-1)+(n-2)+(n-3)+…+3+2+1 = [n(n-1)]/2次,时间复杂度为O(n^2),最好情况的时间复杂度为O(n)
  2. 插入排序法是稳定排序法
  3. 只需一个额外空间,所以空间复杂度为最佳
  4. 此排序法适用于大部分数据已经排过序或已排序数据库新增数据后进行排序的情况
  5. 插入排序法会造成数据的大量搬移,建议在链表上使用

你可能感兴趣的:(python,算法)