冒泡排序与选择排序的时间复杂度分析
冒泡排序的时间复杂度
冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,依次比较相邻元素并根据需要交换它们的位置。这个过程会针对每一个未排序的元素重复进行直到整个序列有序。
对于最优情况——即输入数组已经是升序排列的状态下,冒泡排序只需要一次完整的扫描就能完成操作而无需任何交换动作,此时其时间复杂度为 O(n)3。然而,在最坏情况下(当初始数据完全逆序时),每次迭代都需要执行最大数量的比较和交换操作,这使得总的操作次数接近于 (\frac{3n(n-1)}{2}),从而得出最坏情况下的时间复杂度同样为 O(n²)。
选择排序的时间复杂度
选择排序通过不断寻找剩余部分中的最小值并将之移动到已排序区域末端来工作。无论待排序的数据集处于何种状态,选择排序总是按照固定的模式运行:每一轮都必须找到当前子集中最小的那个数并与起始位置上的数值互换位置。
由于每一趟查找最小值的过程涉及到了几乎全部尚未处理过的项目之间的两两对比,即使是在最好的情形里也需要做大量的比较工作。具体而言,即便原始顺序已经很理想也不影响最终所需步数的数量级,因此无论是平均状况还是极端条件下,选择排序的时间复杂度均为 O(n²)4。
综上所述,两种方法虽然都能有效地对小型或近乎有序的小规模集合实施有效排序,但在面对大规模随机分布的数据时表现不佳,因为两者均具有平方级别的渐近性能指标O(n²)。不过值得注意的是,冒泡排序在特定场景下能够展现出更好的线性行为(O(n)),比如当输入本身就很整齐或是仅存在少量错位的情形之下。
def bubble_sort(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
def selection_sort(arr):
for i in range(len(arr)):
min_idx = i
for j in range(i+1, len(arr)):
if arr[min_idx] > arr[j]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]