排序算法(三):插入排序详解

前言: 最近换工作,面试稍微大一点的厂都会被问到算法和数据结构这块知识,得空自己总结一下吧,总结不到位希望大佬指正哈。

情景记忆: 插入排序其实蛮好记的,看排序的名称也很容易联想,“插入”是这个排序的核心思想,那插入的时候是怎么个插入法?你只要知道它是从无序的数据中插入到有序的序列中,你可以联想到体育老师再第一次上课的时候总会给全体同学排队的场景,先拉一个同学站号,再拉第二个与第一个比较身高来确定第二个的位置,再拉第三个与前面两个比较身高来确定位置。。。。。。

逻辑实现: 以上的记忆方法和亲切,这样就很容易记住了。逻辑其实也十分简单,一次从无序队列中拿一个,在有序队列中确定位置。

代码实现:
正向排序:

def insert_sort(my_list):
    n = len(my_list)
    for i in range(0, n):
        location = i
        while location > 0:
            if my_list[location] < my_list[location - 1]:
                my_list[location], my_list[location - 1] = my_list[location - 1], my_list[location]
                location -= 1
            else:
                break
        print("第%s趟:" % (i + 1), my_list)


if __name__ == '__main__':
    my_list = [7, 2, 0, 1, 5, 6, 8, 3, 9, 4]
    insert_sort(my_list)


运行结果:
第1趟: [7, 2, 0, 1, 5, 6, 8, 3, 9, 4]2趟: [2, 7, 0, 1, 5, 6, 8, 3, 9, 4]3趟: [0, 2, 7, 1, 5, 6, 8, 3, 9, 4]4趟: [0, 1, 2, 7, 5, 6, 8, 3, 9, 4]5趟: [0, 1, 2, 5, 7, 6, 8, 3, 9, 4]6趟: [0, 1, 2, 5, 6, 7, 8, 3, 9, 4]7趟: [0, 1, 2, 5, 6, 7, 8, 3, 9, 4]8趟: [0, 1, 2, 3, 5, 6, 7, 8, 9, 4]9趟: [0, 1, 2, 3, 5, 6, 7, 8, 9, 4]10趟: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

逆向排序:

def insert_sort(my_list):
    n = len(my_list)
    for i in range(0, n):
        location = i
        while location > 0:
            if my_list[location] > my_list[location - 1]:
                my_list[location], my_list[location - 1] = my_list[location - 1], my_list[location]
                location -= 1
            else:
                break
        print("第%s趟:" % (i + 1), my_list)



if __name__ == '__main__':
    my_list = [7, 2, 0, 1, 5, 6, 8, 3, 9, 4]
    insert_sort(my_list)
 
 
运行结果:
第1趟: [7, 2, 0, 1, 5, 6, 8, 3, 9, 4]2趟: [7, 2, 0, 1, 5, 6, 8, 3, 9, 4]3趟: [7, 2, 0, 1, 5, 6, 8, 3, 9, 4]4趟: [7, 2, 1, 0, 5, 6, 8, 3, 9, 4]5趟: [7, 5, 2, 1, 0, 6, 8, 3, 9, 4]6趟: [7, 6, 5, 2, 1, 0, 8, 3, 9, 4]7趟: [8, 7, 6, 5, 2, 1, 0, 3, 9, 4]8趟: [8, 7, 6, 5, 3, 2, 1, 0, 9, 4]9趟: [9, 8, 7, 6, 5, 3, 2, 1, 0, 4]10趟: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

选择排序总结:
没有最好的算法只有最合适的算法,一个算法的好坏,与运用的场景通常是于算法的时间复杂度、空间复杂度和稳定性相关的。

时间复杂度:时间复杂度的衡量标准是每次比较和交换位置所花的时间综合,也就是完成排序所花的时间总和称为时间复杂度;计算标准是一次循环(不论循环几次)我们记为n,如果能够差分为二叉树结构的我们记为log n,那么插入排序的时间复杂度我们可用看出是O(n^2)

空间复杂度:空间复杂度的衡量标准是在完成排序的整个过程中是否有申请新的存储空间来完成排序,如果有,且申请的空间越多那么我们则认为该算法的空间复杂度约复杂,那么冒泡排序在过程中没有申请存储空间,所有我们认为插入排序的空间复杂度小(除了自己本身)

稳定性:即在原序列中,list[i]=list[j],且list[i]在list[j]之前,而在排序后的序列中,list[i]仍在list[j]之前,则称这种排序算法是稳定的,否则称为不稳定的,那么我们认为冒泡排序是稳定的,稳定性比较:堆排序、快速排序、希尔排序、选择排序是不稳定的排序算法,而冒泡排序、插入排序、归并排序是稳定的排序算法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值