什么是冒泡排序:
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
——百度百科
冒泡排序的原理(从小到大排序为例):
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
第一轮交换完成之后最大的数在最后一个;
第二轮交换完之后次大的数在倒数第二个;
......
重复上述交换动作,直到没有任何一对数字需要交换 或者 全部数字比较完成。
图示:比较5 7 8 2 1 3 4
第一轮比较: 得到5 7 2 1 3 4 8
第二轮比较:得到5 2 1 3 4 7 8
同上述步骤
第三轮比较得到:2 1 3 4 5 7 8
第四轮比较得到:1 2 3 4 5 7 8 (因为是随机取的数,导致第四轮就排序完成。通常情况下我们要一直运行到最后一轮才能保证排序完成)
第五轮比较得到:1 2 3 4 5 7 8
第六轮比较得到:1 2 3 4 5 7 8
至此全部比较结束
讲解:
为什么是六轮呢?一共7个数,第一轮将8交换到最后一个,第二轮将7交换到倒数第二个,那么一直到第2个数,是需要交换7-1=6轮的。
那每轮需要比较交换几次呢?第一轮将8交换到最后一个,一共比较交换了6次,第二轮将7交换到倒数第二个,一共比较交换了5次。(那么有人会问,最后一次比较怎么不算?是因为算法本身就是第一次找到最大的数放在最后,那么第二轮进行的时候是不需要再与最后一个数进行比较的)第三轮将5放在倒数第三位,一共比较交换4次。可以得出每轮进行的比较交换次数 = 7 - 第几轮
得出的结论就是,n个数进行比较时,比较n-1轮,每轮比较的次数是n-i(第几轮)
流程图如下:
python代码如下:
正常情况:
num_list = [5, 7, 8, 2, 1, 3, 4]
#[0,6)
for i in range(0,len(num_list) - 1):
for j in range(0,len(num_list) - i - 1):
if num_list[j] > num_list[j + 1]:
n = num_list[j]
num_list[j] = num_list[j + 1]
num_list[j + 1] = n
print(num_list)
考虑特殊情况,比如上边出现的,没有到最后一轮就已经比较完毕
num_list = [5, 7, 8, 2, 1, 3, 4]
for i in range(1, len(num_list)):
# 初始为未交换状态
is_change = False
for j in range(0, len(num_list) - i):
if num_list[j] > num_list[j + 1]:
n = num_list[j]
num_list[j] = num_list[j + 1]
num_list[j + 1] = n
# 发生交换时,标记为true
is_change = True
# 当没有发生交换时,结束循环
if not is_change:
break
print(num_list)