02_Python算法+数据结构笔记-冒泡排序-选择排序-插入排序-快排-二叉树

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mycpen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值