b站视频:路飞IT学城
https://www.bilibili.com/video/BV1mp4y1D7UP
文章目录
个人博客
https://blog.youkuaiyun.com/cPen_web
#11 排序介绍
# 什么是列表排序
# 常⻅排序算法介绍
# 排序算法分析
# 排序:将一组“无序”的记录序列调整为“有序”的记录序列。
# 列表排序:将无序列表变为有序列表
# 输入:列表
# 输出:有序列表 升序与降序
# 升序与降序 # 注:2个基本排序方式
# 内置排序函数:sort()
#-----------------------------------------------------------
### 常见排序算法
# ·排序Low B三人组 ·排序NB三人组 ·其他排序
# 冒泡排序 快速排序 希尔排序
# 选择排序 堆排序 计数排序
# 插入排序 归并排序 基数排序
#12 冒泡排序介绍
### 冒泡排序 (Bubble Sort)
# 列表每两个相邻的数,如果前面比后面大,则交换这两个数。
# 一趟排序完成后,则无序区减少一个数,有序区增加一个数。
# 代码关键点:趟、无序区范围 (重点)
# 注:目的是为了排除来一个升序的列表
#列表 注:右边是下标
# 1 8 <-- 9 和 1比 ;9 >1 交换 9 1 9 8
# 9 7 <-- 8 和 9比 ;8 < 9 不交换 1 7 <-- 比较到倒数第二个
# 2 6 <-- 8 和 2比 ;8 > 9 交换 8 2 8 6
# 8 5 <-- 7 和 8比 ;7 < 8 不交换 2 5
# 3 4 <-- 7 和 3比 ;7 > 3 交换 7 3 7 4
# 6 3 <-- 7 和 6比 ;7 > 6 交换 7 6 3 3
# 4 2 <-- 7 和 4比 ;7 > 4 交换 7 4 6 2
# 5 1 <-- 7 和 5比 ;7 > 5 交换 4 5 4 1
# 7 0 5 0 <--
#这是冒泡排序的1趟 从小到上走一遍 最后箭头只会到倒数第2个元素 (因为不会往后比了)
#冒泡排序 就像烧开水 气开了一样
#这一趟下来 这1个最大的数上去了 这个位置肯定就是最后1个
#上面的叫有序区(已经排好了的),下面的叫无序区
#第二趟只要对整个无序区进行排序,因为9已经排好了的
#第0趟有序区没有数
#第1趟有序区 9
#第2趟有序区 9 8
#第3趟有序区 9 8 7
#第4趟有序区 9 8 7 6
#第5趟有序区 9 8 7 6 5
#第6趟有序区 9 8 7 6 5 4 # 注:每一趟出来1个数 但是叫第6趟 因为从第0趟开始数的
#第7趟有序区 9 8 7 6 5 4 3
#第8趟有序区 9 8 7 6 5 4 3 2
#这1趟不用做了 9 8 7 6 5 4 3 2 1 #注:只剩下1个数的时候 不用做了
#注:整个排序算法排了 n - 1 趟
#注:循环1趟会出来1个最大的数
### 代码关键点:趟、无序区范围 (重点)
# 第0趟有序区没有数
# 第1趟有序区有1个数
#注:列表切片顾头不顾尾 n-2
# 第2趟 ;n长度 i第i趟 ;n - i;无序区还剩n - i个数
# 第2趟 n-i =9-2=7 还剩7个数 最上面那个数下标为6
# 但箭头不会指到 下标为6 那 因为后面没有数了 所有指到下标为5的数 ;n-i-1
#13 冒泡排序
import random # 注:导入随机模块
def bubble_sort(li): # 注:传入列表
for i in range(len(li)-1): # 注:整个算法排了n - 1 趟;i表示 第 i 趟 且从0开始
#上面定义走n-1趟
# 注:每一趟里都有1个指针,箭头永远从0开始,到 n - i -1
for j in range(len(li)-i-1): # 注:实际是确定的箭头 指针顾头不顾尾
# 注:每一趟里都有1个指针,箭头永远从0开始,到 n - i -1
# 注:想想第0趟 排n-1个数 下标n-i-2 (0,n-i-1) 这代表n-i-1个
if li[j] > li[j+1]: # 注:箭头要和下一个元素 比较大小 如果这个数大于后边的数
# 注:li[j]箭头那个数 li[j+1] 箭头后面那个数
li[j], li[j+1] = li[j+1], li[j] # 注:大于就交换
# 注:Python内部实现 实际是 元组的交换
print(li)
# li = [random.randint(0,10000) for i in range(1000)] # 注:列表生成式 生成长度是1000的列表
# print(li) # 打印列表
# bubble_sort(li) # 注:调用算法
# print(li) # 打印排序后的列表
#结果为
#[6507, 6107, 1706, 4345, 3183,…………
#[8, 10, 13, 51, 53, 53, 57, ………… # 注:升序的
li = [3,2,4,6,5,9,8,7,1]
print(li)
bubble_sort(li)
#结果为
# [3, 2, 4, 6, 5, 9, 8, 7, 1] # 注:原来的列表
# [2, 3, 4, 5, 6, 8, 7, 1, 9] # 9
# [2, 3, 4, 5, 6, 7, 1, 8, 9] # 8
# [2, 3, 4, 5, 6, 1, 7, 8, 9] # 7
# [2, 3, 4, 5, 1, 6, 7, 8, 9] # 6
# [2, 3, 4, 1, 5, 6, 7, 8, 9] # 5
# [2, 3, 1, 4, 5, 6, 7, 8, 9] # 4
# [2, 1, 3, 4, 5, 6, 7, 8, 9] # 3
# [1, 2, 3, 4, 5, 6, 7, 8, 9] # 2 1自动最小了
### 注:如果想降序排序 小于的 上去就行了 改 if li[j] < li[j+1]:
# 时间复杂度:O(n**2)
# 注:n 是列表长度 算法里没有发生循环折半的过程 2层关于n的循环 所以复杂度O(n**2)
#####################################################################################
def bubble_sort2(li):
for i in range(len(li)-1):
for j in range(len(li)-i-1):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
# 时间复杂度:O(n2)
#####################################################################################
li = [9,8,7,1,2,3,4,5,6]
print(li)
bubble_sort(li)
#结果为
# [9, 8, 7, 1, 2, 3, 4, 5, 6]
# [8, 7, 1, 2, 3, 4, 5, 6, 9]
# [7, 1, 2, 3, 4, 5, 6, 8, 9]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
# [1, 2, 3, 4, 5, 6, 7, 8, 9] # 注:这1趟没有任何交换
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
####################################################################
#改善:如果在1趟过程中 没有发生交换 ,我们就认为 已经排好序了
#怎样改进? 加1个标志位 在i循环 那里 放1个标志位
# 如果冒泡排序中的一趟排序没有发生交换,则说明列表已经 有序,可以直接结束算法。
def bubble_sort_1(li):
for i in range(len(li)-1):
exchange = False # 在第i趟那加标志位
for j in range(len(li)-i