冒泡排序与插入排序:基础排序算法解析
冒泡排序 (Bubble Sort)
动态演示
冒泡排序动态图
核心步骤
1.比较相邻元素:从数组首端开始,依次比较相邻元素。
2.交换位置:若当前元素大于后一个元素,则交换位置。
3.重复遍历:每轮遍历将最大值“冒泡”到数组末尾,遍历次数逐轮减少。
def bubble_sort(arr):
n = len(arr)
for i in range(n-1):
for j in range(n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
时间复杂度
最坏情况:O(n²) - 当列表是逆序的时候
最好情况:O(n) - 当列表已经有序时(可以通过添加标志位优化)
平均情况:O(n²)
空间复杂度
O(1) - 只需要常数级别的额外空间
插入排序 (Insertion Sort)
动态演示
核心步骤
1.构建有序子序列:从第二个元素开始,逐步将元素插入已排序的子序列。
2.后移元素腾位:若当前元素小于子序列元素,则子序列元素后移。
3.插入目标位置:找到合适位置后插入当前元素。
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i-1
while j >=0 and key < arr[j]:
arr[j+1] = arr[j]
j -= 1
arr[j+1] = key
return arr
时间复杂度
最坏情况:O(n²) - 当列表是逆序的时候
最好情况:O(n) - 当列表已经有序时
平均情况:O(n²)
空间复杂度
O(1) - 只需要常数级别的额外空间
冒泡排序 vs 插入排序
虽然这两种算法的时间复杂度在最坏和平均情况下都是O(n²),但在实际应用中:
性能:插入排序通常比冒泡排序更快,因为它的内部循环更高效,交换操作更少
交换次数:冒泡排序每次发现顺序不对就交换,而插入排序找到正确位置后才进行一次插入
适应性:插入排序是自适应的,当输入数组几乎有序时,它的性能接近O(n)
稳定性:两者都是稳定的排序算法(相等元素的相对位置不会改变)
应用场景
虽然这两种算法在大数据量时效率不高,但在某些情况下仍然有用:
小规模数据排序
作为更复杂算法的基础(如希尔排序使用插入排序)
教育目的,帮助理解排序算法的基本原理
总结
冒泡排序和插入排序是两种基础的排序算法,虽然它们的效率不如快速排序、归并排序等高级算法,但理解它们的工作原理对于学习更复杂的算法非常有帮助。在实际应用中,对于小规模或几乎有序的数据,插入排序可能是一个不错的选择。
希望这篇博客能帮助你更好地理解这两种基础排序算法!