排序算法(一):冒泡排序详解

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

情景记忆: 其实冒泡排序学校都学烂了的,但是很奇怪的是为什么有些时候过一段时间就会忘记实现逻辑呢?那是没有经常使用,说实话工作中一般不会用到的,但是我们可以用场景记忆把他刻在脑中:你只要又一些生活小常识就可以记得很牢固了,把它比喻为鱼吐泡泡的场景,鱼在水底下吐的泡泡刚吐出来的时候是很小的,随着气泡的上升,气泡就会越来越大,最终浮出水面破掉;这个场景就十分像我们的冒泡排序从小到大排序的思维了,一个泡泡破碎的过程看作一趟排序。

逻辑实现: 说完记忆方法,逻辑其实也就十分清晰了,依次对比相邻的值,把最大的或最小的移到最后面

代码实现:
正向排序:

def bubble_sort(list):
    list_len = len(list)
    for i in range(0, list_len):
        print("第%d趟" % (i+1))
        for j in range(1, list_len):
            if list[j-1] < list[j]:
                list[j-1], list[j] = list[j], list[j-1]
        print(list)


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


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

逆向排序:

def bubble_sort(list):
    list_len = len(list)
    for i in range(0, list_len):
        print("第%d趟" % (i+1))
        for j in range(1, list_len):
            if list[j-1] < list[j]:
                list[j-1], list[j] = list[j], list[j-1]
        print(list)


if __name__ == '__main__':
    my_list = [7, 2, 0, 1, 5, 6, 8, 3, 9, 4]
    bubble_sort(my_list)
 
 
运行结果:
第1[7, 2, 1, 5, 6, 8, 3, 9, 4, 0]2[7, 2, 5, 6, 8, 3, 9, 4, 1, 0]3[7, 5, 6, 8, 3, 9, 4, 2, 1, 0]4[7, 6, 8, 5, 9, 4, 3, 2, 1, 0]5[7, 8, 6, 9, 5, 4, 3, 2, 1, 0]6[8, 7, 9, 6, 5, 4, 3, 2, 1, 0]7[8, 9, 7, 6, 5, 4, 3, 2, 1, 0]8[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]9[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]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/115772540