IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Python数据结构(排序) -> 正文阅读

[数据结构与算法]Python数据结构(排序)

最近好多天都没有更新,主要是在学习Python数据结构,哎,一言难尽,大一C语言数据结构没有好好学,导致现在几乎从头开始,学习算法的话,希望大家一定好好掌握python语言基础,没有基础的话,可能学习很困难,然后后面的话有很多算法,希望大家不仅仅是理解,更多是完全掌握,这样才能在以后的面试考试中对自己学的代码架构理解程度更高。

? ? ? ? 补充一点,我在学习数据结构时,又在前面的Python笔记中加了很多笔记,但是因为记录的比较乱,后面我会整理一下发出去,但是具体的时间待定,毕竟补充的也很少,哪里不懂直接私信我就好了。

目录

3. 排序

常见的排序算法

3.1 冒泡排序(Buddle Sort)

3.2 选择排序(select sort )

3.3 插入排序(insert sort)

3.4 快速排序(quick sort)


3. 排序

  • 排序:将一组“无序”的记录序列调整为“有序”的记录序列

  • 列表排序

    • 输入:列表

    • 输出:列表

  • 升序与降序

  • 内置排序函数:sort() sorted()

常见的排序算法

冒泡排序? ? ? ? 选择排序? ? ? ? 插入排序

快速排序? ? ? ? 堆排序? ? ? ? ? ? 归并排序

希尔排序? ? ? ? 计数排序? ? ? ? 基数排序

3.1 冒泡排序(Buddle Sort)

  • 列表每两个相邻的数,如果前面的比后面大,则交换这两个数

  • 一趟排序完成后,则无序区减少一个数,有序区减少一个数

  • 时间复杂度 O(n2)

# 升序
?def bubble_sort(li):
? ? ?for i in range(len(li) - 1): # 循环遍历 n-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] # 交换两个数的位置
? ? ? ? ? ? ? ? ?pass
? ? ? ? ? ? ?pass
? ? ? ? ?print(li)
?# 降序
?def bubble_sort2(li):
? ? ?for i in range(len(li) - 1): # 循环遍历 n-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] # 交换两个数的位置
? ? ? ? ? ? ? ? ?pass
? ? ? ? ? ? ?pass
? ? ? ? ?print(li)
??
?# 升级版,减少排序次数,如果前面已经有序的话,不再排序
??
?def bubble_sort(li):
? ? ?for i in range(len(li) - 1): # 循环遍历 n-1 躺
? ? ? ? ?exchange = False # 无交换的话返回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] # 交换两个数的位置
? ? ? ? ? ? ? ? ?exchange = True # 交换的换返回True
? ? ? ? ?print(li)
? ? ? ? ?if not exchange: # 如果exchange没有变化,证明排序完成,不需要执行下面的循环
? ? ? ? ? ? ?return
?li = [1,2,3,4,5,6,7,9,8]
?# print(li)
?bubble_sort(li)

3.2 选择排序(select sort )

简单的排序

  • 缺点:

    • 产生两个列表,占内存大

    • 时间复杂度O(n2)

# 简单的选择排序
??
?def select_sort_simple(li):
? ? ?li_new = []
? ? ?for i in range(len(li)):
? ? ? ? ?min_val = min(li) #找到最小值
? ? ? ? ?li_new.append(min_val) # 添加到新列表中
? ? ? ? ?li.remove(min(li)) # 再旧列表中删除最小值
? ? ? ? ?pass
? ? ?return li_new
?li = [1,2,4,3,7,9,6,8]
?print(select_sort_simple(li))
# 正常的选择排序

?def select_sort(li):
? ? ?for i in range(len(li)-1): # i 表示第几躺
? ? ? ? ?min_loc = i # 最小值的位置
? ? ? ? ?for j in range(i+1,len(li)):
? ? ? ? ? ? ?if li[j] < li[min_loc]:
? ? ? ? ? ? ? ? ?min_loc = j
? ? ? ? ?if min_loc != i:
? ? ? ? ? ? ?li[i], li[min_loc] = li[min_loc], li[i]
? ? ? ? ?# print(li)
?li = [5,8,9,6,4,2,3]
?select_sort(li)
?print(li)
  • 时间复杂度:O(n2)

3.3 插入排序(insert sort)

  • 初始时手里(有序区)只有一张牌

  • 每次从(无序区)摸一张牌,插入到手里已有牌的位置

  • 时间复杂度:O(n2)

def insert_sort(li):
? ? ?for i in range(1,len(li)): ?# i 表示摸到牌的下标
? ? ? ? ?tmp = li[i]
? ? ? ? ?j = i - 1 # j指的是手里牌的下标
? ? ? ? ?while j >= 0 and li[j] > tmp:
? ? ? ? ? ? ?li[j+1] = li[j]
? ? ? ? ? ? ?j -= 1 # j往右移
? ? ? ? ?li[j+1] = tmp
?li = [1,4,2,5,3,6]
?print(insert_sort(li))
?print(li)

3.4 快速排序(quick sort)

  • 归位函数

?def partition(li,left,right):# 归位函数
? ? ?tmp = li[left]
? ? ?while left < right:
? ? ? ? ?while left < right and li[right] >= tmp: # 从右边找到比tmp小的数
? ? ? ? ? ? ?right -= 1 # 往左移一位
? ? ? ? ? ? ?pass
? ? ? ? ?li[left] = li[right] # 把右边的值写到左边的空位上
? ? ? ? ?while left < right and li[left] <= tmp:
? ? ? ? ? ? ?left += 1
? ? ? ? ? ? ?pass
? ? ? ? ?li[right] = li[left] # 把左边的值写到右边的空位上
? ? ? ? ?# print(li)
? ? ?li[left] = tmp # 把tmp归位
? ? ?return left
?li = [5,7,4,6,3,2,9,8]
?partition(li,0,len(li)-1)
?print(li)
?# 全部快速排序
?def partition(li,left,right):# 归位函数
? ? ?tmp = li[left]
? ? ?while left < right:
? ? ? ? ?while left < right and li[right] >= tmp: # 从右边找到比tmp小的数
? ? ? ? ? ? ?right -= 1 # 往左移一位
? ? ? ? ? ? ?pass
? ? ? ? ?li[left] = li[right] # 把右边的值写到左边的空位上
? ? ? ? ?while left < right and li[left] <= tmp:
? ? ? ? ? ? ?left += 1
? ? ? ? ? ? ?pass
? ? ? ? ?li[right] = li[left] # 把左边的值写到右边的空位上
? ? ? ? ?# print(li)
? ? ?li[left] = tmp # 把tmp归位
? ? ?return left
??
?def quick_sort(li,left,right):
? ? ?if left < right: # 至少两个元素
? ? ? ? ?mid = partition(li,left,right)
? ? ? ? ?quick_sort(li,left,right-1)
? ? ? ? ?quick_sort(li,mid+1,right)
??
?li = [5,7,4,6,3,2,9,8]
?quick_sort(li,0,len(li)-1)
?print(li)
  • 时间复杂度 O(nlogn)

  • 最坏情况:当列表为倒叙时,时间复杂度为O(n2)

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 14:16:53  更:2022-01-08 14:17:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:47:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码