什么是冒泡排序?
简单来说就是一个无序的列表,每次拿一个数,这个数依次和前面的数作比较,直到把它放到正确的位置,以此类推直到每个数都比较完成
我们用代码实现一下:
import random
def bubble_sort(li):
for i in range(len(li)-1): # 第i趟
for j in range(len(li)-i-1):
if li[j] > li[j+1]: # 降序改为小于号
li[j],li[j+1]=li[j+1],li[j]
li = [random.randint(0,1000) for i in range(10)]
print(li)
bubble_sort(li)
print(li)
代码中使用了嵌套的for循环实现,最后用random方法生成随机数测验。
第一层循环确定一个列表总共需要几趟(移动一个数为一趟),比如一个10个元素的列表,移动完9趟,最后一个数已经自动排好位置了,所以是列表长度减1。
第二层循环用图来解释:
图中橙色为有序区(已经排好的),白色为无序区(还未进行排序的),图中为第二趟(从0开始因为列表元素是从0开始的) ,此时无序区还有七个数(总共9个数),所以是列表长度减趟数。箭头依次从下往上数,直到7这个数就不会往上走了因为1上面没有可比较的数,所以还要减1。
所以第二层循环是len(li)-i-1。循环里面就是如果下面的数比上面的大就交换位置。
random函数的randint方法表示生成0-1000的随机数(包括0和1000),循环生成10个
代码运行结果如下:
此代码有一个明显的缺点,我们在第二层循环后面加个print 打印每趟的结果,然后给他一个列表
def bubble_sort(li):
for i in range(len(li)-1): # 第i趟
for j in range(len(li)-i-1):
if li[j] > li[j+1]: # 降序改为小于号
li[j],li[j+1]=li[j+1],li[j]
print(li)
li = [1,2,3,4,6,5]
print(li)
bubble_sort(li)
print(li)
结果如下:
可以看到列表中只有5和6的顺序是错误的,第二趟顺序就已经全部对了,但是它还是执行了很多次。所以我们对代码进行一个优化,有效减少它的运行时间。
def bubble_sort(li):
for i in range(len(li)-1): # 第i趟
exchange = False
for j in range(len(li)-i-1):
if li[j] > li[j+1]: # 降序改为小于号
li[j],li[j+1]=li[j+1],li[j]
exchange = True
print(li)
if not exchange:
break
li = [1,2,3,4,6,5]
print(li)
bubble_sort(li)
我们在第一层循环下面加一个变量,给他赋值为False,如果某一趟结束变量的值依然为False,那就说明顺序已经对了,我们用break结束循环。
运行结果如下:
我们用一个已经排序好的列表测试一下
li = [1,2,3,4,5]
结果:
减少了很多行结果,也就是减少了很多运行时间,所以说这是一个比较好的优化