冒泡排序
概念
每一个元素都可以像小气泡一样,根据自身的大小一点一点的向数组的一侧移动,就像小气泡一样慢慢的冒了上来
原理
重复问的走过数组,一次比较两个数字,将较大的数字向后进行交换,每一趟只能将一个数字进行归位,即第一趟可以将末位上的数归位,第二趟可以当讲倒数第二位上的数归位,依次类推下去,如果有N个数进行排序,那么只需要将N-1个数归位,也就是需要n-1趟操作。
优缺点
优点:稳定排序
缺点:慢,每次只能移动相邻的两个数据
代码
def dubble_sort(arr):
for i in range(len(arr)-1):
# 如果有序,时间复杂度可以降低到O()N
tag = False
for j in range(0,len(arr)-i-1):
if arr[j] > arr[j+1]:
arr[j],arr[j+1] = arr[j+1],arr[j]
# 发生了交换,就意味数组不是有序的
tag = True
# 走过一轮之后,没有发生交换,就意味着是有序的
if tag == Fasle:
return
复杂度
当数组是有序的时候,时间复杂度可以来到O(N)级别的
因为都是在数组内进行交换,并未使用额外空间,所以空间复杂度为O(1)
因为是两两比较的,相同的数不会交换位置,例如7,2,7,2,9,第一轮交换变成2,7,7,2,9,然后7和7相等,下标直接移动到第二个7上,让第二个7去跟2比较,整个过程中是不会发生位置交换的。
时间复杂度 | |
---|---|
最优 | O(N) |
最差 | O(N²) |
平均 | O(N²) |
空间复杂度 | O(1) |
稳定性 | 稳定 |