python冒泡排序,非常细节

        动图放上。


        排序的核心是比较两个数的大小。两个数的排序很easy,三个数排序也只是两两比较2次,四个数排序也是两两比较两个数。

        进行多次的两个数比较,无非是:获得最大值或者最小值,得出最大最小值之后,再在剩下的数里面找出最大最小值。……

        冒泡排序升序排序的主要思路:

        1,两两比较找到最大值,将其放到数组尾巴处,不再参与排序。

        2,剩下的n-1个数继续两两比较找出最大值,放到数组倒数第二个位置。

        3,一直比较……

        4,直到只有最后两个数比较时,排序完成。

        若有错误,请指正。

目录

一,冒泡排序是怎么进行两两比较的?

二,冒泡排序把比出来的最大值放到哪里?

三,冒泡排序需要循环多少次才能完成排序?

四,每次找最大值时,需要两两比较多少次?

五,冒泡排序总共需要两两比较多少次?

六,冒泡排序如何优化?

1,什么情况下需要优化?

2,如何实现优化?

2.1 怎么判断需要优化,进而提前结束算法?

2.2 优化方法?

七,python代码实现冒泡排序

八,python代码实现冒泡排序(优化版)


一,冒泡排序是怎么进行两两比较的?

        答:从左往右相邻两个数两两比较。

二,冒泡排序把比出来的最大值放到哪里?

        两两比较找出最大值之后,可以把这个最大值放到一个新数组里面,但这样浪费内存空间。重点是:冒泡排序从左往右两两比较天然的将最大值移到了数组容器最后面

三,冒泡排序需要循环多少次才能完成排序?

        答:n-1次,当有n个数需要排序,需要两两比较的轮数为n-1次,即需要找出n-1个最大值,最后一个自然为最小。

四,每次找最大值时,需要两两比较多少次?

        答:若当前剩下数字个数为n,则需要n-1次。很明显,他就是不停的在未排序的数字中找最大值,自然需要两两比较当前剩余数字的个数-1次。

五,冒泡排序总共需要两两比较多少次?

        答:最差情况下的次数为:(n-1)(n-2)(n-3)(n-4)……

六,冒泡排序如何优化?

1,什么情况下需要优化?

        1,当一个数组已经排好了顺序,我们再对其排序是毫无意义的。

        2,当在排序过程中,提前出现排序完成的情况,但是算法过程还将继续,这也是无意义的。

2,如何实现优化?

2.1 怎么判断需要优化,进而提前结束算法?

        当在一次找最大值的过程中,没有出现交换两个数情况,即:剩下未排序的数字已经是排好序的了。

2.2 优化方法?

        设置标志位flag,当在一次找最大值的过程中,没有出现交换两个数情况,则置flag为true,结束排序。

七,python代码实现冒泡排序

import random


def Bubble_sort(arr: list):
    total_circle = len(arr) - 1
    # 将2,1进行排序,至少需要1轮;
    # 将3,2,1进行排序,第一轮:2,3,1;2,1,3;第二轮:1,2,3。至少需要两轮。
    # ……
    # 将n,n-1,n-2,……进行排序,则至少需要n-1轮
    # 每一轮循环都把当前循环轮中的最大值沉底(冒泡排序:小的数浮出水面,大的数沉到水底)
    for i in range(total_circle):  # 外层循环,循环n-1次
        index = 0
        while index <= total_circle - 1:  # 内层循环,每轮循环期间,需要两两比较(n-1)-1次
            if arr[index] > arr[index + 1]:
                arr[index], arr[index + 1] = arr[index + 1], arr[index]  # 排序算法的核心:比较两个数的大小,进行交换
            index = index + 1  # 从左往右依次比较两个数的大小,索引+1进行移动
        total_circle = total_circle - 1  # 每一轮循环之后,当前轮的最大值会被移到最后面,这个值将不再参加排序。则总循环次数-1。


if __name__ == '__main__':
    arr_test = [int(random.random() * 100) for i in range(10)]
    print('排序之前的列表:')
    print(arr_test)
    Bubble_sort(arr_test)
    print('排序之后的列表:')
    print(arr_test)

八,python代码实现冒泡排序(优化版)

import random


def Bubble_sort(arr: list):
    total_circle = len(arr) - 1
    # 将2,1进行排序,至少需要1轮;
    # 将3,2,1进行排序,第一轮:2,3,1;2,1,3;第二轮:1,2,3。至少需要两轮。
    # ……
    # 将n,n-1,n-2,……进行排序,则至少需要n-1轮
    # 每一轮循环都把当前循环轮中的最大值沉底(冒泡排序:小的数浮出水面,大的数沉到水底)
    for i in range(total_circle):  # 外层循环,循环n-1次
        index = 0
        flag = 0  # 0表示没有交换过
        while index <= total_circle - 1:  # 内层循环,每轮循环期间,需要两两比较(n-1)-1次
            if arr[index] > arr[index + 1]:
                arr[index], arr[index + 1] = arr[index + 1], arr[index]  # 排序算法的核心:比较两个数的大小
                flag = 1
            index = index + 1  # 从左往右依次比较两个数的大小,索引+1进行移动
        if flag == 0:  # 当在一次找最大值的过程中,未交换过两个数,则直接退出排序过程,即退出外层循环。
            print('奇迹!排序过程中发现已经完成排序了')
            break
        total_circle = total_circle - 1  # 每一轮循环之后,当前轮的最大值会被移到最后面,这个值将不再参加排序。则总循环次数-1。


if __name__ == '__main__':
    arr_test = [int(random.random() * 100) for i in range(10)]
    print('排序之前的列表:')
    print(arr_test)
    Bubble_sort(arr_test)
    print('排序之后的列表:')
    print(arr_test)


# 多运行几次,会出现提前排好序的情况
  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值