1、定义
对一个序列进行从小到大排序,将这个序列分为有序序列和无序序列,首先将第一个元素放入有序序列,剩下的都属于无序序列;然后选择无序序列中第一个与有序序列中的比较,如果小则放前面,大则放后面;然后这两个排好序的为有序序列,剩下的为无序序列,再在无序序列中选择第一个,插入有序序列中的合适位置;以此类推,一个个将剩下的元素插入有序序列中,最后得到一个有序序列。
其中插入时,先从有序序列的最后一个进行比较,一个个向前比较。
2、python实现
def insert_sort(alist):
n=len(alist)
for j in range(1,n):
# 表示从右边的无序序列中一共取出多少个元素执行这样的过程
# i表示内层循环起始值
i = j
while i > 0:
# 内层循环
# 执行从右边的无序序列中取出第一个元素,即i位置的元素,
# 然后将其插入到前面的正确位置中(通过和前面元素一个个比较插入)
if alist[i] < alist[i-1]:
alist[i],alist[i-1]=alist[i-1],alist[i]
i -= 1
else:
# 表示如果i元素比前一个元素大,就不一个个进行比较,直接退出进行下一个
# 这样对于一个有序序列来说,时间复杂度就为n
# 而且对于等值的两个元素,不会进行交换,因此是稳定的排序算法
break
if __name__ == '__main__':
list=[11,32,1,45,98,67,5,44,75]
print(list)
insert_sort(list)
print(list)
结果:
[11, 32, 1, 45, 98, 67, 5, 44, 75]
[1, 5, 11, 32, 44, 45, 67, 75, 98]
3、时间复杂度
- 最优时间复杂度:O(n)(升序排列,序列已处于升序状态)
- 最坏时间复杂度:O(n2)
- 稳定性:稳定