在计算机科学的世界里,排序算法是基础且至关重要的一部分。它们就像是一群训练有素的士兵,能够将无序的数据整理得井井有条。而冒泡排序,作为排序算法中的“元老”,以其简单易懂的思想和实现方式,成为了初学者入门排序算法的首选。今天,我们就来深入探究一下冒泡排序的基本思想和原理。
冒泡排序的基本思想可以用一个形象的比喻来描述:就像在水中的气泡,大的气泡会不断地往上冒,最终浮到水面。在冒泡排序中,我们将待排序的元素看作是水中的气泡,每一轮比较都会将最大(或最小,取决于排序顺序)的元素“浮”到正确的位置。
具体来说,冒泡排序会重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
假设我们有一个包含 5 个元素的数组 [5, 3, 8, 4, 2]
,我们要对其进行升序排序。下面是详细的排序过程:
从数组的第一个元素开始,依次比较相邻的两个元素。如果前一个元素比后一个元素大,则交换它们的位置。
5
和第 2 个元素 3
,因为 5 > 3
,所以交换它们的位置,数组变为 [3, 5, 8, 4, 2]
。5
和第 3 个元素 8
,因为 5 < 8
,所以不交换位置,数组仍为 [3, 5, 8, 4, 2]
。8
和第 4 个元素 4
,因为 8 > 4
,所以交换它们的位置,数组变为 [3, 5, 4, 8, 2]
。8
和第 5 个元素 2
,因为 8 > 2
,所以交换它们的位置,数组变为 [3, 5, 4, 2, 8]
。经过第一轮比较,最大的元素 8
已经“浮”到了数组的最后一个位置。
此时,我们只需要对前 4 个元素进行比较。
3
和第 2 个元素 5
,因为 3 < 5
,所以不交换位置,数组仍为 [3, 5, 4, 2, 8]
。5
和第 3 个元素 4
,因为 5 > 4
,所以交换它们的位置,数组变为 [3, 4, 5, 2, 8]
。5
和第 4 个元素 2
,因为 5 > 2
,所以交换它们的位置,数组变为 [3, 4, 2, 5, 8]
。经过第二轮比较,第二大的元素 5
已经“浮”到了倒数第二个位置。
对前 3 个元素进行比较。
3
和第 2 个元素 4
,因为 3 < 4
,所以不交换位置,数组仍为 [3, 4, 2, 5, 8]
。4
和第 3 个元素 2
,因为 4 > 2
,所以交换它们的位置,数组变为 [3, 2, 4, 5, 8]
。经过第三轮比较,第三大的元素 4
已经“浮”到了倒数第三个位置。
对前 2 个元素进行比较。
3
和第 2 个元素 2
,因为 3 > 2
,所以交换它们的位置,数组变为 [2, 3, 4, 5, 8]
。经过四轮比较,数组已经完成了升序排序。
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
# 测试
arr = [5, 3, 8, 4, 2]
sorted_arr = bubble_sort(arr)
print(sorted_arr)
复杂度类型 | 具体情况 |
---|---|
时间复杂度 | 最好情况:当数组已经是有序的,只需要进行一轮比较,时间复杂度为 $O(n)$;平均情况和最坏情况:需要进行 $n(n - 1)/2$ 次比较,时间复杂度为 $O(n^2)$。 |
空间复杂度 | 只需要常数级的额外空间,空间复杂度为 $O(1)$。 |
冒泡排序以其简单的思想和实现方式,为我们打开了排序算法的大门。虽然它在效率上存在一定的局限性,但对于小规模数据的排序,或者作为学习排序算法的入门示例,冒泡排序仍然具有重要的价值。通过对冒泡排序的学习,我们可以更好地理解排序算法的基本原理,为学习更高效的排序算法打下坚实的基础。