📜  当存在O(n)个反演时,插入排序的时间复杂度如何?(1)

📅  最后修改于: 2023-12-03 15:39:32.829000             🧑  作者: Mango

插入排序及反演

插入排序是排序算法中的一种,其基本思想是将待排序序列划分为已排序和未排序两部分,每次从未排序序列中取出第一个元素,在已排序序列中找到插入位置,将其插入到已排序序列中相应的位置。这样,每次操作后序列就有一个更多的元素处于已排序状态。直到未排序序列为空,则得到一个有序序列。

反演是指一个逆序对的交换。逆序对是指在一个排好序的序列中,如果数组下标为i的元素大于下标为j的元素,且i<j,则称(i,j)为一个逆序对。如序列{23, 18, 14, 8, 1}中的逆序对为(0,1),(0,2),(0,3),(0,4),(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)。反转序列中的两个元素,可以将一个逆序对变为非逆序对,或者将一个非逆序对变为逆序对。

时间复杂度

对于一个长度为n的待排序序列,其平均时间复杂度为O(n^2)。当序列中存在O(n)个逆序对时,插入排序的时间复杂度最坏情况下达到O(n^2)。因为每插入一个元素,就要遍历已排序序列,并比较大小,需要O(n)的时间复杂度。若序列中存在很多逆序对,插入时需要频繁进行反演,使得时间复杂度增加。

代码片段
def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key
参考资料
  • 《算法导论》(原书第三版)