冒泡排序
# bubblesort
"""
用第一个数和第二个数比较,如果前者小于后者,不做交换,否则交换位置
然后用第二个数和第三个数比较,如果前者小于后者,不做交换,否则交换位置
以此类推,然后最大的数在最右边,次要大的数在倒数第二个,最终实现排序
"""
def bubble_sort(li):
n = len(li)
# 内部循环每一次能把最大的数移动到最右边,共n-1次
for j in range(n - 1): # 0 1 2 3
# 内部循环一遍,如果没有执行过交换,证明数据已经有序(提高效率)
flag = 0
# 定义游标,从0移动到倒数第二个位置
for i in range(n - 1 - j): # n-1 n-2 n-3
# 拿当前位置与下一个位置的数据比较
if li[i] > li[i + 1]:
li[i], li[i + 1] = li[i + 1], li[i]
flag += 1
# 如果没有这个判断,对于大部分是有序,最后几个元素无序的列表来说
# 会增加没有必要的循环,加上之后可以提高效率
if flag == 0:
return
if __name__ == '__main__':
l = [4, 2, 3, 5, 1]
l = [5, 4, 3, 2, 1]
bubble_sort(l)
print(l)
# 稳定性:稳定
# 最坏时间复杂度:O(n^2)
# 最优时间复杂度:O(n)