一、什么是冒泡排序?
1、就是相邻的比较大小,然后交换位置,比如【1,3,2,4】(小放前,大放后)。
2、那1跟3比较,不需要交换;3跟2比较,交换;此时更新了列表[1,2,3,4];3跟4比较,不交换。
3、4后面没有值了,我们不需要再一次比较。
二、代码解析
1、可以看到长度是8,但我们-1变成7躺,就少一次循环,优化代码
def mpa_px(li):
for i in range(len(li)-1): # 第i躺,为什么不是len(li)躺,因为最后第二趟已经排序好了,所以直接-1,当然也可以是len(li),就会多走一趟
for j in range(len(li)-i-1): # 无序列表范围、指针移动
if li[j]>li[j+1]: # 前一个大于后面一个进入交换
li[j],li[j+1] = li[j+1],li[j]
print(li)
lis = [2,3,4,5,7,8,6,1]
mpa_px(lis)
2、内层循环
for j in range(len(li)-i-1):
这个内层循环的目的是在当前趟中,从未排序的部分找到最大的元素并将其放到正确的位置。让我们分解一下这个循环的范围:
len(li)-i-1
:len(li)
是列表的长度。i
是当前外层循环的索引,表示已经排好序的元素个数。len(li)-i-1
表示在当前趟中需要比较的元素个数。因为前i
个元素已经在前面的趟次中排好序了,所以剩下的未排序元素个数就是len(li)-i-1
。
举个例子,假设列表长度为5(即 len(li) = 5
),那么:
- 在第1趟(
i=0
)中,内层循环的范围是range(5-0-1)
,即range(4)
,也就是[0, 1, 2, 3]
。这表示我们需要比较第0到第3个元素。 - 在第2趟(
i=1
)中,内层循环的范围是range(5-1-1)
,即range(3)
,也就是[0, 1, 2]
。这表示我们只需要比较第0到第2个元素,因为第3和第4个元素已经在第1趟中排好序了。
3、比较和交换
在内层循环中,每一对相邻的元素都会被比较,如果顺序错误(即前一个元素大于后一个元素),它们的位置就会被交换:
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
三、代码结果
四、优化冒泡排序
我们从上面可以看出上面的做法时间复杂度是O(n**2),但我们可以优化不必要的次数
def mpa_px(li):
for i in range(len(li)-1): # 第i躺,为什么不是len(li)躺,因为最后第二趟已经排序好了,所以直接-1,当然也可以是len(li),就会多走一趟
exec = False
for j in range(len(li)-i-1): # 无序列表范围、指针移动
if li[j]>li[j+1]: # 前一个大于后面一个进入交换
li[j],li[j+1] = li[j+1],li[j]
exec = True
print(li)
if not exec:
return
lis = [1,2,4,3,5,7,6]
mpa_px(lis)
标签:解释,元素,交换,len,li,range,循环,冒泡排序,详细
From: https://blog.csdn.net/CNY8888/article/details/143467226