数据结构与算法之排序算法 冒泡排序 原地排序 / 稳定性 原理与优化

数据结构与算法阿木 发布于 2025-07-12 8 次阅读


冒泡排序:原理、优化与实现

排序算法是计算机科学中基础且重要的算法之一,它广泛应用于数据处理、数据库管理、网络通信等领域。冒泡排序作为一种简单的排序算法,因其易于理解和实现而被广泛研究。本文将围绕冒泡排序的原理、优化以及实现进行深入探讨。

冒泡排序原理

冒泡排序是一种原地排序算法,其基本思想是通过重复遍历要排序的序列,比较相邻的元素,如果它们的顺序错误就把它们交换过来。遍历序列的工作是重复进行的,直到没有再需要交换的元素为止,这意味着该序列已经排序完成。

工作原理

1. 比较相邻元素:从序列的第一个元素开始,比较相邻的两个元素。

2. 交换元素:如果第一个比第二个大(升序排序),则交换它们的位置。

3. 移动到下一个元素:对下一对相邻元素重复步骤 1 和 2,直到到达序列的末尾。

4. 重复过程:重复步骤 1~3,直到没有再需要交换的元素。

示例

假设有一个未排序的数组 `arr = [64, 34, 25, 12, 22, 11, 90]`,冒泡排序的过程如下:

- 第一次遍历:`[34, 25, 12, 22, 11, 64, 90]`(交换64和34)

- 第二次遍历:`[25, 12, 22, 11, 34, 64, 90]`(交换34和25)

- 第三次遍历:`[12, 22, 11, 25, 34, 64, 90]`(交换25和22)

- 第四次遍历:`[12, 11, 22, 25, 34, 64, 90]`(交换22和11)

- 第五次遍历:`[11, 12, 22, 25, 34, 64, 90]`(交换22和12)

- 第六次遍历:`[11, 12, 22, 25, 34, 64, 90]`(没有交换,排序完成)

冒泡排序的稳定性

冒泡排序是一种稳定的排序算法。稳定性意味着在排序过程中,相同值的元素会保持它们原始的相对顺序。在冒泡排序中,如果两个元素相等,它们在遍历过程中不会交换位置,因此保持了稳定性。

冒泡排序的优化

尽管冒泡排序简单易实现,但其效率较低,其平均和最坏情况的时间复杂度均为O(n^2)。以下是一些优化方法:

1. 提前终止

在冒泡排序中,如果在一轮遍历中没有发生任何交换,说明数组已经排序完成,可以提前终止算法。

python

def bubble_sort_optimized(arr):


n = len(arr)


for i in range(n):


swapped = False


for j in range(0, n-i-1):


if arr[j] > arr[j+1]:


arr[j], arr[j+1] = arr[j+1], arr[j]


swapped = True


if not swapped:


break


return arr


2. 记录最后一次交换位置

在每一轮遍历中,记录最后一次发生交换的位置,这个位置之后的元素在下一轮遍历中不需要再次比较,因为它们已经是有序的。

python

def bubble_sort_optimized2(arr):


n = len(arr)


while n > 0:


new_n = 0


for i in range(1, n):


if arr[i-1] > arr[i]:


arr[i], arr[i-1] = arr[i-1], arr[i]


new_n = i


n = new_n


return arr


实现与测试

以下是一个冒泡排序的Python实现,包括优化后的版本:

python

def bubble_sort(arr):


n = len(arr)


for i in range(n):


for j in range(0, n-i-1):


if arr[j] > arr[j+1]:


arr[j], arr[j+1] = arr[j+1], arr[j]


return arr

def bubble_sort_optimized(arr):


n = len(arr)


for i in range(n):


swapped = False


for j in range(0, n-i-1):


if arr[j] > arr[j+1]:


arr[j], arr[j+1] = arr[j+1], arr[j]


swapped = True


if not swapped:


break


return arr

测试代码


arr = [64, 34, 25, 12, 22, 11, 90]


print("Original array:", arr)


print("Sorted array:", bubble_sort(arr))


print("Optimized sorted array:", bubble_sort_optimized(arr))


总结

冒泡排序是一种简单且稳定的排序算法,虽然其效率不高,但在数据量较小的情况下仍然可以使用。通过优化,我们可以提高冒泡排序的效率。在实际应用中,我们可以根据具体需求选择合适的排序算法。