数据结构与算法:冒泡排序(原理讲解+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)的复杂度。

冒泡排序是一种稳定排序 通过代码我们可以发现如果相邻两个元素相等 它们之间是不会发生交换动作的 原来排在前面的元素还是排在前面。

 

posted @ 2021-01-13 16:09  小和尚写代码  阅读(669)  评论(0编辑  收藏  举报