20.4. 冒泡排序

20.4.1. 方式一

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/6/27 17:52
# filename: 冒泡算法01.py

def bubble_sort(nums):
    flags = True  # 循环的标志
    while flags:
        flags = False
        for i in range(len(nums) - 1):
            if nums[i] > nums[i + 1]:
                # 交换元素位置
                nums[i], nums[i + 1] = nums[i + 1], nums[i]

                # 将标志设置为True,继续循环
                flags = True


list_test = [8, 6, 5, 3, 7, 10]
bubble_sort(list_test)
print(list_test)

输出信息

[3, 5, 6, 7, 8, 10]

这个算法在一个 while 循环里面运行,仅当没有元素能够交换时才会跳出循环。 我们在开始时将 flags 设为 True,以确保算法至少可以执行一次。

20.4.2. 方式二

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/7/20 9:11
# filename: 冒牌算法02.py

# 冒牌排序
def bubbleSort(num):
    for j in range(len(num) - 1, -1, -1):
        for i in range(j):
            if num[i] > num[i + 1]:  # 把数值小的数字放到顶端
                num[i], num[i + 1] = num[i + 1], num[i]
            print(num)


def main():
    numbers = [10, 8, 7, 11, 29, 7]
    bubbleSort(numbers)


if __name__ == '__main__':
    main()

输出信息

[8, 10, 7, 11, 29, 7]
[8, 7, 10, 11, 29, 7]
[8, 7, 10, 11, 29, 7]
[8, 7, 10, 11, 29, 7]
[8, 7, 10, 11, 7, 29]
[7, 8, 10, 11, 7, 29]
[7, 8, 10, 11, 7, 29]
[7, 8, 10, 11, 7, 29]
[7, 8, 10, 7, 11, 29]
[7, 8, 10, 7, 11, 29]
[7, 8, 10, 7, 11, 29]
[7, 8, 7, 10, 11, 29]
[7, 8, 7, 10, 11, 29]
[7, 7, 8, 10, 11, 29]
[7, 7, 8, 10, 11, 29]

eg

#冒泡排序
import bubbleSort
arr1=[1,3,5,7,9,8,6,4,2,0]
print(len(arr1),"个元素排序前:",arr1)
#arr=bubbleSort.bubbleSort(arr1)
arr=bubbleSort.bubbleSortPlus(arr1)
print("排序后:",arr)
#冒泡排序
showDebug=int(input("打印调试信息吗?【1】是;【0】否:"))
def bubbleSort(arr):
    """冒泡排序"""
    for i in range(len(arr)-1):
        for j in range(len(arr)-1-i):
            if(arr[j] < arr[j + 1]):
                arr[j],arr[j+1]=arr[j+1],arr[j]
        if showDebug==1:print("(调试信息)第",i+1,"轮:",arr)
    return arr


#列表构造器
def arrMaker(a,b,qty):
    """产生qty个[a,b)之间的整数"""
    import random
    arr=[]
    for i in range(qty):
        arr.append(random.randint(a,b))
    return arr

#改良的冒泡排序
def bubbleSortPlus(arr):
    s=1                                         #设置状态标志s
    for i in range(len(arr)-1):
        if s==1:                            #s==1时执行后续排序操作
            s = 0       #如果一轮循环中s没有改变,s=0状态持续到下一轮
            for j in range(len(arr)-1-i):
                if(arr[j] < arr[j + 1]):
                    arr[j],arr[j+1]=arr[j+1],arr[j]
                    s = 1       #只要还存在一次交换,s就重被置为1
            if showDebug==1:print("(调试信息)第",i+1,"轮:",arr)
        else:
            break       #s=0时结束排序
    return arr

20.4.3. 参考文献

Python 实现排序算法