Python编程基础:嵌套for循环实现list冒泡排序

需求:冒泡排序,是一种常见的算法,举例list列表的数字元素进行排序:降序or升序,函数式编程实现
# 分析:冒泡排序是两个相邻的值进行比较,比较前后位置的值的大小,进行交换位置进行排序;
# 索引[0]会跟索引[1]进行比较,如果前面的大就交换位置,交换位置之后原来[0]位置变成了位置[1];
# 那么位置[1]再跟[2]比较,如果小,不交换原位置不变,位置[2]再跟位置[3]的元素进行比较,如果大就交换位置;
# 重复上面的步骤一直升序把list中大的元素排列到后面;再进行第二轮,把第二大的值排在倒数第二的位置。

为了直观理解上面的分析思路,先看效果图:不是那种画的表格图,是排序的过程: [10, 9, 8, 7, -6, 5, 4, 3, 2, 1]

Python编程基础:嵌套for循环实现list冒泡排序_第1张图片

结果是不是符合解题思路,那么现在上代码:

def sorted_list(list_num, reverse="True"):
    """
    reverse="True"为升序,反之降序
    :param list_num: 接收列表参数
    :param reverse:
    :return:
    """
    for i in range(1, len(list_num)): # 外层循环控制次数
        for j in range(0, len(list_num) - 1): # 内循环len-1防止索引越界
            if reverse == "True":               # 控制升序
                if list_num[j] > list_num[j + 1]: # 如果前面的值比后面的大
                    temp = list_num[j]              # 中间变量接收,后面进行交换位置
                    list_num[j] = list_num[j + 1]
                    list_num[j + 1] = temp
# 三行交换位置代码,可以在python一行实现:list_num[j],list_num[j + 1] = list_num[j + 1],list_num[j]
            else:                                       # reverse不为True降序
                if list_num[j] < list_num[j + 1]:
                    temp = list_num[j]
                    list_num[j] = list_num[j + 1]
                    list_num[j + 1] = temp
# 三行交换位置代码,可以在python一行实现:list_num[j],list_num[j + 1] = list_num[j + 1],list_num[j]
        print("第{}次冒泡排序list结果:{}".format(i, list_num))

list_sort = [10, 9, 8, 7, -6, 5, 4, 3, 2, 1]
# 传入的list可以input提示用户输入交互,然后拆分,迭代即可
sorted_list(list_sort)
# 有个缺陷,就是遇到排序次数

上面的结果是没问题,但是仔细一看,却发现了,在执行到第四次的时候,就已经完成了排序,但是后面还在继续执行,所以上面的冒泡排序是个伪冒泡,也就是时间最坏排序,始终会执行元素个数-1次,下面来优化代码:

def bubble_sorted(list_num, reverse="True"):
    """
    reverse="True"为升序,反之降序
    :param list_num: 接收列表参数
    :param reverse:
    :return:
    """
    for i in range(1, len(list_num)): # 外层循环控制当前没有出现最值的索引
        isPer=False
        for j in range(len(list_num)-i): # 内循环是控制前面的元素和剩余的元素进行比较
            if list_num[j] > list_num[j+1]: # 如果前面的值比后面的大,
                list_num[j],list_num[j+1]=list_num[j+1],list_num[j]
                isPer=True
        if not isPer:
            return list_num 
        print("第{}次选择排序最后list结果:{}".format(i, list_num))

list_sort = [21, 14, 31, 10, -14, 33, 40]

# print(bubble_sorted(list_sort))

 

你可能感兴趣的:(Python编程基础)