冒泡排序
简单介绍
冒泡排序是计算机中比较简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。无论是排升序还是降序,最大或者最小的元素回像泡泡一样慢慢的浮出水面,顾名思义,冒泡排序。
算法思想
假设存在乱序数组arr,需求是通过冒泡排序将arr转化成升序的数组
- 从数组头开始,相邻元素进行比较, 较大者后移。比较范围是:从数组的首个元素至数组的末尾元素。
- 一轮比较完成后,再次从头开始相邻元素间比较,较大者后移,比较范围较上一轮减少一次
- 每一轮都能筛选出当前比较范围内最大元素,排在对应的位置。eg第一轮比较完成后,能够找到数组里最大的一个数,排在了最末尾的位置;第二轮比较完成后,找到了数组里第二大的数,排在了倒数第二的位置
- 直至比较范围内元素只有一个时,不再比较,数组此时为升序数组
动画演示
文本版
冒泡排序动画演示:
初始数组:[5, 3, 8, 4, 2]
第一轮排序:[3, 5, 4, 2, 8](5和3交换,8和4交换,8和2交换)
第二轮排序:[3, 4, 2, 5, 8](5和4交换,5和2交换)
第三轮排序:[3, 2, 4, 5, 8](4和2交换)
第四轮排序:[2, 3, 4, 5, 8](3和2交换)
动画版
代码实现
def bubbleSort(arr:List[int])->List[int]:
length = len(arr)
for i in range(length):
for j in range(0, length - i - 1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
时间复杂度
假设乱序数组arr,长度为n
第一次比较次数为 n - 1
第二次比较次数为 n - 2
第三次比较次数为 n - 3
.....
第n-1次比较次数为 0
总共比较次数为 0 + 1 + 2 + .... + n - 1
利用等差数列的求和公式 (首项+末项) * 项数 / 2 即 (n-1)n / 2
所以时间复杂度为 O(n^2)
整体时间复杂度
● 最坏的情况:O(n*(n-1)/2) 即 O(n^2),原本为降序排列的元素,每一次都需要进行比较,交换位置。
● 最好的情况:O(n) 原本为升序数组,无需进行交换,只需要外部遍历一次即可
● 平均情况:O(n^2)
空间复杂度
变量length, i, j所占的存储空间都是常量,与输入的数据无关,所以空间复杂度为 O(1)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。