数据结构和算法(十二)插入排序

定义

插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

算法步骤

  • 将第一元素当做一个有序序列,第二个到最后一个元素当做无序序列。
  • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。

动图分析

过程分析

这六个数组成的无序序列[5,9,3,6,2,7],由小到大排序。
按照插入排序算法,过程如下:

  • 第一个数字 5 当做有序序列不动,第二个数字 9 和 5比较 ,9大于5,所以把9插入5后面,第一次插入排序结果为:[5, 9, 3, 6, 2, 7]。


  • 然后第三个数字3和9比较,9大于3,继续比较3和5,5比3大,所以3插入5的位置,第二次插入排序结果为:[3, 5, 9, 6, 2, 7]。


  • 然后第四个数字6和9比较,9比6大,继续比较5和6,6大于5,所以6插入5的后面,第三次插入排序结果为:[3, 5, 6, 9, 2, 7]。


  • 然后第五个数字2和9比较,9比2大,所以继续比较6和2......,直到合适位置,第四次插入排序结果为:[2, 3, 5, 6, 9, 7]。


  • 然后最后一个数字7和9比较,9比7大,所以继续比较6和7,7大于6,所以插入6的后面,第五次插入排序结果为:[2, 3, 5, 6, 7, 9]


  • 到此为止,序列变成有序的了。

python实现插入排序

def insert_sort(arr):
    count = 0
    # 从第二个数字开始,向前插入
    for i in range(1, len(arr)):
        # 从第i个元素开始向前比较,如果小于前一个元素,交换位置
        for j in range(i, 0, -1):
            count += 1
            if arr[j] < arr[j - 1]:
                arr[j], arr[j-1] = arr[j-1], arr[j]
        print('第{}次插入排序结果为:{}'.format(i, arr))
    print("循环次数为:{}".format(count))
    return arr


if __name__ == '__main__':
    arr = [5, 9, 3, 6, 2, 7]
    print(insert_sort(arr))

结果:

第1次插入排序结果为:[5, 9, 3, 6, 2, 7]
第2次插入排序结果为:[3, 5, 9, 6, 2, 7]
第3次插入排序结果为:[3, 5, 6, 9, 2, 7]
第4次插入排序结果为:[2, 3, 5, 6, 9, 7]
第5次插入排序结果为:[2, 3, 5, 6, 7, 9]
循环次数为:15
[2, 3, 5, 6, 7, 9]

时间复杂度

  • 最优时间复杂度:O(n) (升序排列,序列已经处于升序状态)
  • 最坏时间复杂度:O(n^2)

稳定性

对于值相同的元素,我们可以选择将后面出现的元素,插入到前面出现元素的后面,这样就可以保证原有的前后顺序不变,因此插入排序是一种稳定的排序算法。

你可能感兴趣的:(数据结构和算法(十二)插入排序)