[每日一题]44用Python实现插入排序

Posted Python极客社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[每日一题]44用Python实现插入排序相关的知识,希望对你有一定的参考价值。


Python Every Day, 第 44 期



插入排序:

原理:每次插入一个数将它和之前已经完成排序的序列进行重新排序,也就是找到需要插入的位置。

稳定性:稳定

时间复杂度:o(n²)


过程:(假设为正序排序)


假设前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,所以直接退出循环,完成排序。

上面是一个完整的插入排序的过程。


代码如下:
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


以上,便是今天的分享,希望大家喜欢,觉得内容不错的,欢迎点击「在看」支持,谢谢各位。

如需查看更多[Python Every Day]系列,请点击我的主页的【每日一题】菜单。


感谢您的阅读


以上是关于[每日一题]44用Python实现插入排序的主要内容,如果未能解决你的问题,请参考以下文章

Java算法 每日一题 编号35:搜索插入位置

Java算法 每日一题 编号35:搜索插入位置

Java每日一题——>剑指 Offer II 035. 最小时间差(三解,蛮力,排序,哈希)

每日刷题记录

Java每日一题——>剑指 Offer II 029. 排序的循环链表

Java每日一题——>剑指 Offer II 034. 外星语言是否排序