冒泡排序Bubble Sort
Bubble Sort
列表每两个相邻的数,如果前面比后面大,则交换这两个数
一趟排序完成后,则无序区减少一个数,有序区增加一个数
关键:趟数、无序区范围
趟数:因为最后一个不用排,所以趟数为列表长度减一
每一趟都会在有序区放入一个元素,所以下标索引要控制在无序区内
import random
def Bubble_sort(list):
# 第一层:趟数,一共排len(list)-1趟,最后一个不用排
for i in range(0,len(list)-1):
# 第二层,表示元素的下标索引
for j in range(0,len(list)-i-1):
if list[j] >= list[j+1]:
# 交换值
list[j],list[j+1] = list[j+1],list[j]
return list
------------------------------------
list2 = [random.randint(0,100) for i in range(10)]
print(list2)----->[33,49,47,8,53,59,37,18,9,45]
print(Bubble_sort(list2))--->[8,9,18,33,37,45,47,49,53,59]
-
每一次都要与后一位比较,如果当下标索引到了最后以一个元素,之后没有可以比较的,所以索引下标还需要减一,让索引到无序区的倒数第二个即可
-
交换值:python确实比其他语言方便一点,这样即可交换,不用设置一个temp来过渡,其内部实现是通过元组来交换的
list[j],list[j+1] = list[j+1],list[j] -
随机生成数字列表
list2 = [random.randint(0,100) for i in range(10)]
生成一个0到100以内的长度为10的数字列表
- 示例代码是升序,如果想要降序,只要将判断条件改为<=即可
- 时间复杂度为O(n的平方)
优化Bubble Sort
之前的代码,每一趟都只能往有序区放入一个元素,每一个元素都会要遍历,当列表为[9,8,7,1,2,3,4,5,6],这时如果需要对其进行升序排列,会发现,只需三趟就可以完成,但是原算法还是会逐个遍历,走完八趟,后面的五次是不变的,我们需要把后面不做修改的次数优化掉。代码如下:
import random
def Bubble_sort(list):
# 第一层:趟数,一共排len(list)-1趟,最后一个不用排
for i in range(0,len(list)-1):
exchange = False # 设置一个标志位
# 第二层,表示元素的下标索引
for j in range(0,len(list)-i-1):
if list[j] >= list[j+1]:
# 交换值
list[j],list[j+1] = list[j+1],list[j]
exchange = True # 发生了交换就变为True
if not exchange: # 如果还是False,就输出列表
return list
-
设置了一个标志位exchange,初始表示False
-
在内层循环的if判断中加入exchange = True,意思是:如果在一趟中,有元素发生交换,exchange就变成True,没有发生交换就还是False
-
在外层循环,用if not判断exchange的值是否为False,来判断是否终止循环并返回列表。意思是:如果上一趟发生了交换,exchange就是True,判断不通过(需要exchange为False才能通过),就开始下一趟;如果上一趟没有发生交换,exchange保持为False,就直接输出列表,后面就不用遍历了
-
if not 条件:
这个语句是用来判断是否为False的,if语句的条件为真就执行,这个相反,if not 语句中,条件为False才会执行。

浙公网安备 33010602011771号