Python——冒泡排序(原理剖析)


前言

我在大学里面主要学习的语言主要是python,而这一学就是4年,不敢说有多么厉害,但是还是有一点点基础,由于最近都在学Java,对于python就基本不摸了,但是一想不对,最起码还是随便看看,敲敲代码吧,反正工具IDE还在。

一、冒泡排序概念

冒泡排序是一种对有序集合中数据元素排序的方法。每一次对有序集合的遍历都是将较大数交换到后面,重复这个过程,每次遍历都会将最大值换到最后一位,每次遍历后,该有序集合的规模都会减少一个。

二、原理分析

为了方便我干脆就使用list,里面的元素未冒泡排序为1,8,6,5,2
第一趟,一共有有5个数据

比较谁大是否交换位置目前列表
1和8比8大[1,8,6,5,2]
8和6比8大[1,6,8,5,2]
8和5比8大[1,6,5,8,2]
8和2比8大[1,6,5,2,8]

5个数据第一趟比了4次

第二趟

比较谁大是否交换位置目前列表
1和6比6大[1,6,5,2,8]
6和5比6大[1,5,6,2,8]
6和2比6大[1,5,2,6,8]

比了3次

第三趟

比较谁大是否交换位置目前列表
1和5比5大[1,5,2,6,8]
5和2比5大[1,2,5,6,8]

比了2次

第四趟

比较谁大是否交换位置目前列表
1和2比2大[1,2,5,6,8]

比了一次

小结

1、如上面的需要排序的列表的元素数据有5个,比了4趟,从这个规律我们可以得出一个需要排序的有序集合n元素则需要比较n-1
2、从上面的每一趟比较的次数中,我们可以找到这么一个规律,列表中元素的个数 = 第几趟+在该趟中比较的次数,如果是需要排序的有序集合n元素那么比如第一趟就可以写成n = 1+n-1,最后一趟(n-1趟)就可以写成n = n-1 +1。
3、每一次比较都会比出一个最大值放在后面
4、每回比较都是两个数据在比较,视比较结果交换位置

三、代码实现

1.排序方式小------->大

代码如下(示例):

# -*- coding: utf-8 -*-
"""
Created on Fri Mar  5 21:27:27 2021

@author: 老赖的小弟
"""
# 准备需要排序的列表
list = [1,8,6,5,2] 
# 获得list的长度
length = len(list)
# 设置交换需要的临时变量temp
temp=list[0]
# 根据冒泡排序原理及元素个数设置循环的趟数
for i in range(0,length-1):
    # 根据冒泡排序原理设定每趟需要比较的次数
    for j in range(0,length-i-1):
        # 根据比较大小判断是否需要交换
        if list[j] > list[j+1]:
            # 开始交换
            temp = list[j]
            
            list[j] = list[j+1]
            # 交换结束
            list[j+1] = temp
            
print(list)

代码如下(输出):

[1, 2, 5, 6, 8]

2.排序方式大------->小

# 准备需要排序的列表
list = [1,8,6,5,2] 
# 获得list的长度
length = len(list)
# 设置交换需要的临时变量temp
temp=list[0]
# 根据冒泡排序原理及元素个数设置循环的趟数
for i in range(0,length-1):
    # 根据冒泡排序原理设定每趟需要比较的次数
    for j in range(0,length-i-1):
        # 根据比较大小判断是否需要交换
        if list[j] < list[j+1]:
            # 开始交换
            temp = list[j]
            
            list[j] = list[j+1]
            # 交换结束
            list[j+1] = temp
            
print(list)

代码如下(输出):

[8, 6, 5, 2, 1]

总结

其实写代码是其次的,主要是弄明白原理,如果弄不明白原理,那就是等于背代码,很大程度上是做无用功,当然如果你弄明白原理,无非就是换个环境来实现,所以原理很重要(说给初学者听得)。
其实这个大到小还是小到大排序其他都是一样的,只是判断条件哪里if list[j] < list[j+1] 大于,小于符号的改变。这写了几个月的Java代码再来写python真的是满满Java味,特别是冒号,不自主的写成分号,太变扭了。
https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fbpic.588ku.com%2Felement_pic%2F17%2F03%2F30%2Ff6b4c10faf0ef593b1156a149f756be6.jpg&refer=http%3A%2F%2Fbpic.588ku.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1617544890&t=9ea521012cd7c4a0f6816c06410ec1ef

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值