冒泡排序实现原理:只会操作相邻的两个数据,每次冒泡操作都会对相邻的两个元素进行比较,谁大就往后移动,直到将最大的元素排到最后面,接着再循环一趟,从头开始进行两两比较,而上一趟已经排好的那个元素就不用进行比较了。

假设待排序序列为 (5,1,4,2,8),如果采用冒泡排序对其进行升序(由小到大)排序,则整个排序过程如下所示:
1) 第一轮排序,此时整个序列中的元素都位于待排序序列,依次扫描每对相邻的元素,并对顺序不正确的元素对交换位置,整个过程如图 1 所示。

python中冒泡排序代码 python冒泡排序流程图_待排序

图 1 第一轮排序(白色字体表示参与比较的一对相邻元素)

从图 1 可以看到,经过第一轮冒泡排序,从待排序序列中找出了最大数 8,并将其放到了待排序序列的尾部,并入已排序序列中。

2) 第二轮排序,此时待排序序列只包含前 4 个元素,依次扫描每对相邻元素,对顺序不正确的元素对交换位置,整个过程如图 2 所示。

python中冒泡排序代码 python冒泡排序流程图_python中冒泡排序代码_02

 图 2 第二轮排序

可以看到,经过第二轮冒泡排序,从待排序序列中找出了最大数 5,并将其放到了待排序序列的尾部,并入已排序序列中。

3) 第三轮排序,此时待排序序列包含前 3 个元素,依次扫描每对相邻元素,对顺序不正确的元素对交换位置,整个过程如图 3 所示。

python中冒泡排序代码 python冒泡排序流程图_python中冒泡排序代码_03

  图 3 第三轮排序

经过本轮冒泡排序,从待排序序列中找出了最大数 4,并将其放到了待排序序列的尾部,并入已排序序列中。

4) 第四轮排序,此时待排序序列包含前 2 个元素,对其进行冒泡排序的整个过程如图 4 所示。

python中冒泡排序代码 python冒泡排序流程图_待排序_04

图 4 第四轮排序

经过本轮冒泡排序,从待排序序列中找出了最大数 2,并将其放到了待排序序列的尾部,并入已排序序列中。

5) 当进行第五轮冒泡排序时,由于待排序序列中仅剩 1 个元素,无论再进行相邻元素的比较,因此直接将其并入已排序序列中,此时的序列就认定为已排序好的序列(如图 5 所示)。

python中冒泡排序代码 python冒泡排序流程图_排序算法_05

图 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