冒泡排序实现原理:只会操作相邻的两个数据,每次冒泡操作都会对相邻的两个元素进行比较,谁大就往后移动,直到将最大的元素排到最后面,接着再循环一趟,从头开始进行两两比较,而上一趟已经排好的那个元素就不用进行比较了。
假设待排序序列为 (5,1,4,2,8),如果采用冒泡排序对其进行升序(由小到大)排序,则整个排序过程如下所示:
1) 第一轮排序,此时整个序列中的元素都位于待排序序列,依次扫描每对相邻的元素,并对顺序不正确的元素对交换位置,整个过程如图 1 所示。
图 1 第一轮排序(白色字体表示参与比较的一对相邻元素)
从图 1 可以看到,经过第一轮冒泡排序,从待排序序列中找出了最大数 8,并将其放到了待排序序列的尾部,并入已排序序列中。
2) 第二轮排序,此时待排序序列只包含前 4 个元素,依次扫描每对相邻元素,对顺序不正确的元素对交换位置,整个过程如图 2 所示。
图 2 第二轮排序
可以看到,经过第二轮冒泡排序,从待排序序列中找出了最大数 5,并将其放到了待排序序列的尾部,并入已排序序列中。
3) 第三轮排序,此时待排序序列包含前 3 个元素,依次扫描每对相邻元素,对顺序不正确的元素对交换位置,整个过程如图 3 所示。
图 3 第三轮排序
经过本轮冒泡排序,从待排序序列中找出了最大数 4,并将其放到了待排序序列的尾部,并入已排序序列中。
4) 第四轮排序,此时待排序序列包含前 2 个元素,对其进行冒泡排序的整个过程如图 4 所示。
图 4 第四轮排序
经过本轮冒泡排序,从待排序序列中找出了最大数 2,并将其放到了待排序序列的尾部,并入已排序序列中。
5) 当进行第五轮冒泡排序时,由于待排序序列中仅剩 1 个元素,无论再进行相邻元素的比较,因此直接将其并入已排序序列中,此时的序列就认定为已排序好的序列(如图 5 所示)。
图 5 冒泡排序好的序列
Python实现代码为:
def func_sort(n):
for i in range(n-1): # 控制排序次数
for j in range(n-1-i): # 控制比较次数
if L[j]>L[j+1]:
print('{}比{}大,交换前{}'.format(L[j], L[j + 1], L))
L[j], L[j + 1] = L[j + 1],L[j]
print('交换后:{}'.format(L))
else:
print("我不用交换{}".format(L))
print('排序后的列表为:{}'.format(L))
func_sort(len(L))
执行结果:
5比1大,交换前[5, 1, 4, 2, 8]
交换后:[1, 5, 4, 2, 8]
5比4大,交换前[1, 5, 4, 2, 8]
交换后:[1, 4, 5, 2, 8]
5比2大,交换前[1, 4, 5, 2, 8]
交换后:[1, 4, 2, 5, 8]
我不用交换[1, 4, 2, 5, 8]
我不用交换[1, 4, 2, 5, 8]
4比2大,交换前[1, 4, 2, 5, 8]
交换后:[1, 2, 4, 5, 8]
我不用交换[1, 2, 4, 5, 8]
我不用交换[1, 2, 4, 5, 8]
我不用交换[1, 2, 4, 5, 8]
我不用交换[1, 2, 4, 5, 8]
排序后的列表为:[1, 2, 4, 5, 8]
Process finished with exit code 0