排序: 就是由高到低,由大到小,由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)