返回

轻松一“泡”,清晰理解冒泡排序

前端

冒泡排序:算法概述

冒泡排序是一种简单的排序算法,因其形象生动的排序过程而得名。它通过不断比较相邻元素的大小,将较大的元素“泡”到数组末尾,从而使整个数组按从小到大排序。

冒泡排序的具体步骤如下:

  1. 初始化:

    • 将一个标记位设置为 True,表示数组中还有无序元素。
    • 将数组的第一个元素与第二个元素进行比较。
  2. 比较与交换:

    • 如果第一个元素大于第二个元素,则交换这两个元素的位置。
    • 将标记位设置为 False,表示数组中可能还有无序元素。
  3. 循环:

    • 将第一个元素与第三个元素进行比较,依次类推,直到最后一个元素。
    • 重复步骤 2 和 3,直到标记位一直为 True,即数组中已经没有无序元素。
    • 此时,数组已经按从小到大排序。

动图演示:冒泡排序过程

为了更直观地理解冒泡排序的过程,我们准备了一个动图演示。假设我们要对数组 [5, 3, 1, 2, 4] 进行排序。

[动图:冒泡排序过程]

从动图中我们可以看到,冒泡排序通过不断比较相邻元素的大小,将较大的元素“泡”到数组末尾。经过多次比较和交换,最终数组 [1, 2, 3, 4, 5] 按从小到大排序。

优化技巧:提前结束排序

冒泡排序有一个优化技巧,可以减少比较和交换的次数。在排序过程中,我们可以设置一个标记位来跟踪数组中是否还有无序元素。如果在某一次循环中没有发生任何交换,则说明数组已经有序,我们可以提前结束排序。

def bubble_sort(array):
    """冒泡排序算法

    参数:
        array:需要排序的数组

    返回:
        排序后的数组
    """

    # 设置标记位,表示数组中还有无序元素
    swapped = True

    # 循环比较和交换
    while swapped:
        swapped = False  # 重置标记位

        # 遍历数组
        for i in range(1, len(array)):
            # 如果相邻元素无序,则交换位置
            if array[i - 1] > array[i]:
                array[i - 1], array[i] = array[i], array[i - 1]
                swapped = True  # 发生交换,更新标记位

    # 返回排序后的数组
    return array

时间复杂度分析

冒泡排序的时间复杂度为 O(n^2),其中 n 是数组的长度。这是因为冒泡排序需要进行 n 次循环,每次循环中需要比较和交换 n-i 个元素(i 为当前循环的次数)。

结语

冒泡排序是一种简单、易于理解的排序算法。虽然它的时间复杂度较高,但在某些场景下仍然有其应用价值。例如,当数组规模较小或数组已经基本有序时,冒泡排序可以提供良好的性能。

在本文中,我们通过文字和动图介绍了冒泡排序的概念和步骤,并探讨了优化技巧和时间复杂度分析。希望这些内容对您理解冒泡排序有所帮助。