简介
插入排序(Insertion Sort),一般也称为直接插入排序。对于少量元素的排序,它是一个有效的算法。它的基本思想是将待排序元素列中的值插入已排序元素列的合适位置。
思路
(以升序为例)在待排序元素列前创建一个空的元素列,称为已排序元素列
(1)从第二个元素开始,对待排序元素列中的第二个元素进行插入,从已排序元素列的末尾向前,一一进行比较,如果该元素小于已排序元素列中的某个元素,就将该元素及其之后的元素都后移一位,然后插入元素;
(2)对待排序元素列中的第三个元素进行插入,从已排序元素列的末尾向前,一一进行比较,如果该元素小于已排序元素列中的某个元素,就将该元素及其之后的元素都后移一位,然后插入元素;
(3)依次类推,直至所有元素有序
例子:升序排序元素列 [3, 5, 4, 6, 1, 2]
分析
直接插入排序是一种稳定的排序算法,在元素列是正序的情况下,时间复杂度为O(N);如果元素列是反序的,那么时间复杂度为O(N2),因此平均时间复杂度为O(N2)。
代码
普通插入排序
def InsertionSort(List):
size = len(List)
for i in range(1, size):
cur = List[i]
j = i-1
while j >= 0:
if List[j] > cur:
List[j+1] = List[j]
else:
break
List[j+1] = cur
return List
由上文我们可以得知,插入排序算法中,已插入的元素是按序排列的,我们可以利用这一特性对算法进行改进,二分插入排序。
顾名思义,二分插入排序就是将已插入的元素分为两半,判断要插入的元素属于前者还是后者,然后再进行插入,这样减少了计算量。
二分插入排序
def insertionSort(List):
size = len(List)
for i in range(1, size):
cur = List[i]
low, high = 0, i-1
while low <= high:
mid = (low+high)//2
if cur < List[mid]:
high = mid-1
else:
low = mid+1
for j in range(i-1, low-1, -1):
List[j+1] = List[j]
List[low] = cur
return List