1.直接插入排序的基本思想
假设n个数据元素关键字存储在静态数组a中,则直接插入排序的基本思想可做如下描述:
(1)初始有序子序列由一个元素a[0] 组成;
(2)从a[1]开始,对于序列中每个元素a[i],利用顺序查找在有序子序列中找到其合适位置,然后将后面的元素向后移动,并将a[i]插入。
(3)重复上述步骤,直到整个序列有序,算法结束。
2.直接插入排序举例
例:设待排元素序列为{56,25,70,99,82,10,15,56},请给出按直接插入排序算法进行排序的过程。
3.直接插入排序算法代码
def insertion_sort(self):
for i in range(1, len(self.data)): # 依次将i号记录插入在表中0至i-1部分的有序序列中
if self.data[i] < self.data[i - 1]:
temp = self.data[i]
j = i - 1
while j >= 0 and self.data[j] > temp: # 依次与之前的每个记录关键字比较
self.data[j + 1] = self.data[j] # 如前面记录更大则后移
j -= 1 # j往前移动
self.data[j + 1] = temp # temp记录放在j+1位置
4.直接插入排序算法分析
(1)空间复杂度:只需要一个记录大小的辅助空间来临时存放待插入记录,空间复杂度O(1)。 (2)时间复杂度:最好情况下,如果数组本身是从小到大排列的,每趟操作只需要1次比较,总比较次数为n-1,不需要移动数据元素。最坏情况下,如果数组是从大到小排列的,那么关键字的总比较次数为n(n-1)/2,移动的次数为n(n-1)/2,因此时间复杂度为O(n2) 。
(3)该算法是稳定算法。