Python 算法 之 排序算法,概念,示例,冒泡排序

排序: 就是由高到低,由大到小,由xx到xx。。。。。。
排序算法有个概念,叫稳定性,见下图。。
在这里插入图片描述示例,下图阴影的一组,是稳定的
在这里插入图片描述冒泡排序 Bubble Sort
在这里插入图片描述
冒泡排序的基础准备知识:
1 .如何获取元素,就是表示列表中的数?
我们知道,for i in xx 语句,可以获取其中的元素。
获取列表中(假设列表有3个数,2,1,3)的元素,语句如何写 ?
for i in range(长度-1) 一定要减一
2 .但如何表示其中相邻的两个数呢?
用索引!
什么是索引?
序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
一个列表的索引,从0开始,最大就是当前长度减一 len(列表)-1
所以,列表,假定列表是alist,其中的第一个就是alist[0],第二个就是alist[1],第三个就是alist[2],。。。倒数第二个就是alist[n-2],最后一个是 alist[n-1].
n是长度len(alist),i的取值就是0到n-1.
所以最后一个是i+1的话,他就是n-1即 i+1 = n-1,可以拿例子理解:如果一个列表有3个数,那么长度n就是3,第3个元素索引是2,2又是i+1,所以i就等于n-1-1.。。。。。
3 . 每一轮比较(也就是循环)次数都不同,递减,长度依次是n-1次,n-2次,,,,, n-k
4.range() 函数可创建一个整数列表,一般用在 for 循环中。
在这里插入图片描述
示例: 给下图排序
下图,先拿第一个54,和第二个26比较,54大所以交换位置。
然后拿54和第三个93比较,93大所以不需要交换。
然后 。。。。
。。。。

在这里插入图片描述在这里插入图片描述最后,93放到了最后,是最大的。第一轮结束
第二轮
拿26和54比较,。。。。
。。。。
最后,77放到了倒数第二个位置,第二轮结束

在这里插入图片描述第三轮
同理,那个数最后放到了倒数第三个位置

第一轮比较,先比较第1个和第2个,然后23 34 。。。最后n-1 n 如图
在这里插入图片描述
n-1 个和第n个 是最后
n-1的索引是i-2,n的索引是i-1
所以 n-1 = i-1
第一轮结束后,可以找到最大的值,放到最后!
那么第二轮,就可以把第二大的,放在倒数第二个!
。。。。。 重复进行,那么就循环啦。同时i in range(n-1)要变,第一轮减1第二轮减2。。第几轮减几,所以会变成 i in range(n-1)

那么,n个数,比较n-1轮

以上理论理解之后,来开始用代码步步推进,如下
先做个比较,如下:

        if alist[i] > alist[i+1]:                       # 比较两个相邻数,大的就放后面。i是0,就是比较第一个和第二个,i是1就是比较第二个和第三个。。。
            alist[i],alist[i+1]= alist[i+1],alist[i]

这样,就可以把大的数,交换放到后面。做个循环,让比较从头到尾,最大值归位最后!

def  maopao(alist):
    n = len(alist)
    for i in range(n):                           
        if alist[i] > alist[i+1]:                       
            alist[i],alist[i+1]= alist[i+1],alist[i]
alist=[2,3,1]
maopao(alist)  #不要写成print (maopao(alist))调用方法
print (alist)

运行结果,报错:

 if alist[i] > alist[i+1]:                       
IndexError: list index out of range

分析一下:假设列表有3个数,2,1,3,那么要比较大小比较2次是吧,所以range(n)循环n次 应该减去一次即range(n-1)。或者若是range(n)的话,那么i依次取值0,1,2,对吧那么最后一次比较是alist[2]和alist[3],那么有alist[3]吗??alist[3]就是第四个数而实际没有所以造成越界。。。

def  maopao(alist):
    n = len(alist)
    for i in range(n-1):                           
        if alist[i] > alist[i+1]:                       
            alist[i],alist[i+1]= alist[i+1],alist[i]
alist=[2,3,1]
maopao(alist)  #不要写成print (maopao(alist))调用方法
print (alist)

以上是第一轮比较,最大值归位,
那么还要再来,让次大,次次大。。归位,也就是让这个循环再循环。循环几次呢
显然是n-1次,可拿包含3个数的数列理解。。
所以完整如下:

def maopao(alist): 
    n = len(alist)
    for k in range(n-1):        # 几个数据循环 几-1 轮。所以k取值n-1
        for i in range(n-1-k):  # i从0到n-1。每次排好,就少一个,然后少2个,3个。。。。k=0时也就是第一轮,要循环n-1次。 当然,k也可以不写
            if alist[i]>alist[i+1]:                    
                alist[i],alist[i+1]=alist[i+1],alist[i]  
alist=[26,54,17,77,93,31,44,55,20]
maopao(alist)
print(alist)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值