插入排序的原理:每次插入一个数将它和之前已经完成排序的序列进行重新排序,也就是找到需要插入的位置。
稳定性:稳定
时间复杂度:o()
过程:(假设为正序排序)
假设前j-1个元素已经排好序, 将第j个元素分别于其前面元素[i]比较,如i元素较大,则将i元素的值往前移动一位,即 a[i+1] = a[i]
若i元素较小,则直接将j位置的值放到 i+1元素的位置。
输入:[1,5,3,4,5,6,8]----待排序数组
第一次排序:
1 5 3 4 5 6 8
i=0 j=1
此时将j=1对应的5和前面的每一个数对比,此处是1,发现5>1,所以将5放在i+1的位置,此时i=0,前两个数已经排好序。
第二次排序:
1 5 3 4 5 6 8
i=1 j=2
将j=2对应的3作为key和前面的每个数比较,这里先比较3和5,发现5>3,此时将5往后移一位(a[i+1]=a[i]),然后i-1,则比较3和1,发现3>1,所以将3放在5所在的位置,也就是a[i+1]=key。
第三次排序:
1 3 5 4 5 6 8
i=2 j=3
将j=3所对应的4作为key和前面的每个数比较,首先比较4和5,5>4,所以5向后移动一位(a[i+1]=a[i]),然后i-1,比较4和3,由于4>3,所以将4放到5所在的位置。
第四次排序:
1 3 4 5 5 6 8
i=3 j=4
将j=4所对应的5作为key和前面的每个数比较,首先比较5和5,发现5=5,所以直接退出循环
第五次排序:
1 3 4 5 5 6 8
i=4 j=5
将j=5所对应的6作为key和前面的每个数比较,首先比较5和6,发现6>5,所以直接退出循环
第六次排序:
1 3 4 5 5 6 8
i=5 j=6
将j=6所对应的8作为key和前面的每个数比较,首先比较6和8,发现8>6,所以直接退出循环,完成排序。
上面是一个完整的插入排序的过程。
python代码
def insertion_sort(self,nums:list):
length = len(nums)
for j in range(1,length):
key = nums[j]
i = j - 1
while i >= 0 and nums[i] > key:
nums[i + 1] = nums[i]
i = i - 1
nums[i + 1] = key
return nums