• Python排序算法(二)——冒泡排序


    有趣的事,Python永远不会缺席!

    如需转发,请注明出处:小婷儿的python  https://www.cnblogs.com/xxtalhr/p/10786904.html 

    一、冒泡排序(Bubble Sort)

      冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,一层一层的将较大的元素往后移动,其现象和气泡在上升过程中慢慢变大类似,故成为冒泡排序

    1、原理

    • 从第一个和第二个开始比较,如果第一个比第二个大,则交换位置,然后比较第二个和第三个,逐渐往后
    • 经过第一轮后最大的元素已经排在最后,所以重复上述操作的话第二大的则会排在倒数第二的位置。

    • 那重复上述操作n-1次即可完成排序,因为最后一次只有一个元素所以不需要比较

     2、举例

      举个例子,假设我现在有一个数列需要使用冒泡来排序 [11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22],我们来看看使用冒泡的详细步骤:

    • 首先11和99比较大小,99大,99继续和后面的作比较,直到最后一个元素,第一轮完了,列表是  [11, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22, 99]
    • 然后,重复第一轮操作,即第二轮比较列表是  [11, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22, 99],

       比较完后,列表为  [11, 33 , 69, 77, 55, 11, 33, 36,39, 66, 44, 22, , 88,99]

    • 以此类推,最终得到列表  [11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]

     二、代码

      代码用jupyternotebook实现

       实现思路: 使用双重for循环,内层变量为i, 外层为j,在内层循环中不断的比较相邻的两个值(j, j+1)的大小,如果j+1的值大于j的值,交换两者位置,每循环一次,外层的i增加1,等到i等于(len(arr) - 1)的时候,结束循环

      第一次看不懂很正常,不要灰心,下面是使用代码的实现

     1 def bubble_sort(arr):
     2     """冒泡排序"""
     3     # 第一层for表示循环的遍数
     4     for i in range(len(arr) - 1):
     5         # 第二层for表示具体比较哪两个元素
     6         for j in range(len(arr) - 1 - i):
     7             if arr[j] > arr[j + 1]:
     8                 # 如果前面的大于后面的,则交换这两个元素的位置
     9                 arr[j], arr[j + 1] = arr[j + 1], arr[j]
    10     return arr
    11 
    12 bubble_sort([11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22])
    13 #返回结果 [11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]

    三、特点

        冒泡排序是一种简单直接暴力的排序算法,为什么说它暴力?因为每一轮比较可能多个元素移动位置,而元素位置的互换是需要消耗资源的,所以这是一种偏慢的排序算法,仅适用于对于含有较少元素的数列进行排序

    • 稳定性:我们从代码中可以看出只有前一个元素大于后一个元素才可能交换位置,所以相同元素的相对顺序不可能改变,所以它是稳定排序
    • 比较性:因为排序时元素之间需要比较,所以是比较排序

    • 时间复杂度:因为它需要双层循环n*(n-1)),所以平均时间复杂度为O(n^2)

    • 空间复杂度:只需要常数个辅助单元,所以空间复杂度为O(1),我们把空间复杂度为O(1)的排序成为原地排序(in-place)

    • 记忆方法:想象成气泡,一层一层的往上变大

    结果   

      Successfully !!!

      有趣的事,Python永远不会缺席!还不来加我,瞅什么瞅。

  • 相关阅读:
    SU Demos-02Filtering-03Sudipfilt
    SU suspecfk命令学习
    SU suplane命令学习
    (原创)c#学习笔记10--定义类成员01--成员定义01--定义字段
    (原创)c#学习笔记09--定义类08--浅度和深度复制
    (原创)c#学习笔记09--定义类07--结构类型
    (原创)c#学习笔记09--定义类06--接口和抽象类
    (原创)c#学习笔记09--定义类05--类库项目
    (原创)c#学习笔记09--定义类03--构造函数和析构函数
    (原创)c#学习笔记09--定义类02--System.Object
  • 原文地址:https://www.cnblogs.com/pythonbao/p/10786904.html
Copyright © 2020-2023  润新知