数据结构与算法:冒泡排序(原理讲解+python实现)
冒泡排序
冒泡排序是诸多排序算法比较常用,热门的算法之一。一般作为计算机学生们的算法入门基础,有些初级软件工程师的面试也会要求手写冒泡排序的代码。在很多热门的编程语言里面也专门实现了冒泡排序的接口 可以直接调用使用,虽然平均排序效率上偏低 但有些情况下也会被频繁使用。
原理讲解
Python实现
1 def bubblesort(arr, n): 2 flag = 0 # 添加标签 如果要比较的数已经排好序 则跳出单次循环比较 3 for i in range(n-1, -1, -1): # 逆序遍历 每次循环得到最大的数逐个放到最后 4 for j in range(i): 5 if arr[j] > arr[j+1]: 6 arr[j], arr[j+1] = arr[j+1], arr[j] 7 flag = 1 8 9 if flag == 0: # 如果没有发生交换 则跳出本次循环 10 break 11 12 if __name__ == '__main__': 13 arr = [40, 30, 10, 20, 60, 50, 70, 80, 90,90] 14 n = len(arr) 15 bubblesort(arr, n) #用冒泡排序进行升序排序 16 print(arr)
时间,空间复杂度,稳定性分析
冒泡排序的时间复杂度最差、最好、平均都是O(n2), 因为无论序列是否排好序 都需要比较 n(n-1)/2次。 针对加了标签flag的优化版本 如果序列本身就是有序的 则每次循环都比较1次就跳出来 最终总共比较了n-1次 所以时间复杂度为O(n) 如果是完全逆序的 则时间复杂度就是O(n2) 平均复杂度就是O(n2).
冒泡排序的空间复杂度是O(1) 因为整个过程只有两个for循环的比较 还有在元素交换时 需要开启的一个临时中间变量的内存 所以空间上是O(1)的复杂度。
冒泡排序是一种稳定排序 通过代码我们可以发现如果相邻两个元素相等 它们之间是不会发生交换动作的 原来排在前面的元素还是排在前面。