用Python在列表中实现泡沫排序的方法

577 阅读6分钟

在这篇文章中,我们已经解释了泡沫排序的基本原理,同时详细解释了Python在列表中实现泡沫排序的方法。

目录:

  1. 泡沫排序简介
  2. 泡沫排序的Python实现及解释
  3. 复杂度和运行时间
  4. 泡沫排序的应用

让我们开始在Python中实现列表中的泡沫排序。

泡泡排序简介

冒泡排序算法以正确的顺序对一个未排序的列表进行排序。它涉及到查看列表中两个相邻的元素,然后按正确的顺序交换它们。这个过程一直持续到列表的末尾,直到所有的元素都以正确的顺序结束。只有当相邻元素的顺序不正确时,才会发生元素的互换。在排序时,较大的数字向右冒泡,因此被称为冒泡排序。

bubble-sort

语法和流程

冒泡排序算法可以用for-loop轻松实现**。**实现需要以下步骤--

  1. 获取列表的长度(即列表中元素的数量)。让列表中的元素数为'n'。
  2. 遍历列表的'n'个次数,并创建一个变量来检查任何交换。每次都要遍历列表中的所有元素'n-i-1'次。这是因为在每次迭代中,最后一个元素总是以正确的顺序被设置。
  3. 当遍历所有元素时,每次都要检查当前元素是否比下一个元素大。如果是,就把它们交换。
  4. 如果没有发生互换,则退出循环。
  5. 打印最终排序的列表。

泡沫排序的Python实现及解释

下面的程序使用for-loop对一个未排序的列表进行排序,并打印出最终的输出:

# a function to sort a list using bubble sort algorithm
def bubblesort(lst):
        # get the length of the list
        n = len(lst)
        # go through the list n number of times
        for i in range(n):
                # variable to keep check for any swaps
                swap = False
                # traverse through all adjacent elements
                for j in range(0, n-i-1):
                    # if current element greater than next element, swap them
                    if lst[j]>lst[j+1]:
                        lst[j], lst[j+1] = lst[j+1], lst[j]
                        swap = True
                # if no swaps, then break out of the loop
                if swap == False:
                        break
        # print the final sorted list
        print(lst)

# an example unsorted list 
y = [1,5,4,6,7,8,3,2,12,10,9,11]

# function call to sort list y
bubblesort(y)
  1. 首先,我们使用def语句创建一个名为 "bubblesort "的函数。每当我们需要在Python中为我们的程序创建一个自定义的函数时,就会用到这个语句。函数的名字可以是任何东西,但是'bubblesort'在这里是有意义的,因为重点是气泡排序算法。要创建一个函数,首先键入def ,后面是函数的首选名称。然后,在括号内,在函数定义中,我们传入参数,这是一个实际变量的别名,我们随后在函数调用中传入。把参数看作是临时变量,我们在函数中使用它来指定对实际变量进行的改变。这里的参数被命名为lst

  2. 然后我们创建一个名为'n'的变量来存储列表的长度(列表中的项目数)。要在 Python 中得到一个列表的长度,键入len 并在括号内输入列表的名称。在这里,由于是一个函数定义,我们像以前一样传入临时变量,也就是名为lst 的参数。

  3. 之后,我们使用一个for循环,对列表进行'n'次浏览。i的值范围从0到'n-1',因为范围关键字包括'n'以下的值,但不包括'n'。因此,对于'i'的所有值意味着从0开始,直到但不包括'n'的值。

  4. 然后我们创建一个名为swap 的变量,存储一个布尔值(即真或假)。我们以后使用这个变量来检查是否有任何交换发生。初始值被设置为False ,这意味着到目前为止,还没有发生交换。

  5. 之后,我们创建另一个for循环,这次包含一个if语句,用于遍历所有相邻的元素,并检查当前元素是否大于下一个元素。if语句的条件lst[j]>lst[j+1] ,总是返回一个布尔值(真或假),if语句中的代码只在该条件为真时运行。我们使用大于运算符> 来检查这些值。当这个条件为真时,我们通过设置当前元素并将下一个元素的值赋给它来交换元素,反之亦然。由于lst 是一个列表的别名,为了在列表内部查找,我们使用方括号[] 。然后我们将swap 变量设置为 True,意味着现在已经发生了交换。如果没有发生互换,swap 变量就不会发生变化。

  6. 在我们走出第二个for循环后,我们检查是否有交换。为此,我们检查swap 变量。再次使用if语句和平等运算符== 来检查任何交换。如果swap 变量为False,这意味着没有交换,因此,我们使用break 语句跳出整个主for循环。每当我们想脱离 Python 中的任何循环时,我们都会使用这个语句。

  7. 在走出最后的for循环后,我们使用print() 函数,并传入参数lst ,以打印出最后的排序列表。同样,由于这是一个函数定义,我们使用临时变量,也就是名为lst 的参数。

  8. 在上面的例子中,我们使用一个名为y 的列表来测试我们的 bubblesort 函数。这个列表有12个元素。为了使用该函数(或者用正式术语说,调用该函数),我们输入该函数的名称,后面是括号,在括号内,我们传入我们想要排序的列表的名称。

运行上述程序可以得到以下输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

复杂度和运行时间

  • 大O记号:在最坏的情况下,冒泡排序算法的运行时间为n平方。这是因为,在最多的情况下,我们要对未排序的列表进行'n'次处理,并对所有元素进行'n-i-1'次的遍历。随着'n'越来越大,我们倾向于忽略常数。所以最后,算法所经历的总步数是(n)x(n),即n的平方。

  • Big-Omega符号:在最好的情况下,冒泡排序算法的运行时间为'n'。这是因为,最低限度,即使列表中的所有元素都被排序了,我们仍然要对列表进行一次检查。

气泡排序的应用

  • 泡沫排序是一种算法,它可以检测出没有完全排序的数组/列表中即使是很小的错误。这在计算机图形学中得到了应用。

  • 在极小的数据集上,泡沫排序算法在时间复杂度方面比选择排序更好。

问题

泡沫排序中的泡沫意味着什么?

大的数字向右排序

小数字向左冒泡

这些数字在排序时,会像气泡一样以正确的顺序排序。

小数字向右排序

大的数字在排序时向右冒泡,因此被称为气泡排序。

参考文献

阅读关于泡沫分类