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

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

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

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

代码实现:
正向排序:

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]之前,则称这种排序算法是稳定的,否则称为不稳定的,那么我们认为冒泡排序是稳定的,稳定性比较:堆排序、快速排序、希尔排序、选择排序是不稳定的排序算法,而冒泡排序、插入排序、归并排序是稳定的排序算法。

猜你喜欢

转载自blog.csdn.net/xiaoxin_OK/article/details/116403012
今日推荐