python算法与数据结构2-栈、队列、排序算法

news2024/11/25 22:26:52

目录

    • 1、栈
      • 1.1 栈的介绍
      • 1.2 栈的代码实现
    • 2、队列
      • 2.1 队列的介绍
      • 2.2 队列的代码实现
    • 3、双端队列
    • 4、数据结构与算法_排序算法
      • 4.1 排序算法的稳定性
      • 4.2 冒泡排序
      • 4.3 选择排序
      • 4.4 插入排序
      • 4.5 快速排序

1、栈

1.1 栈的介绍

栈:运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算,这一端为栈顶,另一端为栈底。特点:先进后出
栈是计算机系统CPU结构里的一部分
栈的作用:局部变量的方便存储和及时销毁

在这里插入图片描述

1.2 栈的代码实现

借助链表
在这里插入图片描述
所以选择尾部进行增删操作

class Stack(object):
	"""栈:先进后出"""
	def __init__(self):
		self.__items = []
	def push(self):
		"""进栈"""
		self.__items.append(item)
	def pop(self):
		"""出栈"""
		self.__items.pop()
	def trave(self):
		"""遍历"""
		for i in self.__items:
			print(i)

my_stack = Stack()
my_stack.push(1)
my_stack.push(1)
my_stack.push(1)
my_stack.trave()  #输出1\n 2\n 3\n

#出栈
my_stack.pop()
my_stack.trave()  #输出1\n 2\n

2、队列

2.1 队列的介绍

队列:一种特殊的线性表,特殊之处在于它只允许表的头部进行删除操作,表的尾部进行插入操作,是一种操作受限制的线性表,进行插入操作的端为队尾,进行删除操作的端为队头

队列的作用:任务处理类系统(多个任务发起,先存储起来,排队一个一个进行处理,起到了缓冲压力的作用)

2.2 队列的代码实现

在这里插入图片描述
此时选择对头队尾,复杂度都一样了,o(1)+o(n)

在这里插入图片描述

Class Queue(object):
	def __init__(self):
		#存储数据,线性表
		self.items = []
	#enqueue(item)队列尾部添加元素
	def enqueue(self,item):
		self.items.append(item)
	#dequeue(item)队列头添加元素
	def dequeue(self,item):
		self.items.pop(0)
	#is_empty()判断队列是否为空
	def is_empty()(self):
		return self.items == []
	#size()返回队列的大小
	def size(self):
		return len(self.items)
q = Queue()
#添加数据
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)

for i in q.items:
	print(i)  #输出:1\n2\n3\n

#删除数据
q.dequeue() 
for i in q.items:
	print(i)  #输出:2\n3\n

print(q.is_empty())
print(q.size())

3、双端队列

双端队列:是一种具有队列和栈的数据结构。元素可以任意从两端进行插入和删除操作。
在这里插入图片描述
在这里插入图片描述

Class Deque(object):
	def __init__(self):
		self.items = []
	def is_empty(self): #判断是否为空
		return self.items == []
	def size(self):  #大小
		return len(self.items)
	def add_front(self,item): #头部添加数据
		self.items.insert(0,item)
	def add_rear(self,item): #尾部添加数据
		self.items.append(item)
	def remove_front(self,item): #头部删除数据
		self.items.pop(0)
	def remove_rear(self,item):  #尾部删除数据
		self.items.pop()
deque = Deque()
print(deque.is_empty())
print(deque.size())

#添加数据
deque.add_front(1)
deque.add_front(2)
deque.add_rear(3)
deque.add_rear(4)
for i in q.items:
	print(i)  #输出:2\n1\n3\n4\n

#删除数据
deque.remove_front()
deque.remove_rear()
for i in q.items:
	print(i)  #输出:1\n3\n

4、数据结构与算法_排序算法

4.1 排序算法的稳定性

排序:使得一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来
排序算法:如何使得这一串记录按照要求排列的方法

算法的稳定性:
在这里插入图片描述
对于具有相同的关键词的记录,他们的相对次序不变,即这种算法是稳定的,否则是不稳定的
不稳定的排序算法:选择排序、快速排序、希尔排序、堆排序
稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序

4.2 冒泡排序

冒泡排序:重复地走访过要排序的元素列,依次比较两个相邻的元素,如果元素排序错误就交换过来。重复进行直到没有相邻元素需要交换为止

代码实现:

def bubble_sort(alist):
	"""冒泡排序"""
	n=len(alist)
	for j in range(0,n-1):
		count =0
		for i in range(0,n-j-1): #控制每一轮的比较次数
			#比较相邻两数字,不符合要求便交换位置
			if alist[i]>alist[i+1]:
				alist[i],alist[i+1] =alist[i+1],alist[i]
				count +=1
		if count == 0: #如果遍历一轮后没有数字交换,就退出循环,防止浪费资源
			break
if __name__ == '__main__':
	alist = [5,3,4,7,2]
	bubble_sort(alist)
	print(alist)

冒泡排序:
时间复杂度:o(n^2)
最优时间复杂度 :o(n) 最少也需要遍历一遍
算法稳定性:稳定算法 (if alist[i]>alist[i+1]中如果是>= ,则不是稳定算法)

4.3 选择排序

选择排序:第一次从待排序的数据元素中选出最小(大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,放到已排序的序列末尾,依次类推,直到全部排序完
在这里插入图片描述

def select_sort(alist):
	"""选择排序"""
	n = len(alist) #列表的长度
	for j in range(0,n):
		min_index = j #假定的最小值下标
		for i in range(j+1,n):
			if alist[i] < alist[min_index]:   #进行比较获得最小值的下标
				min_index = i
		if min_index !=j:
			alist[min_index],alist[j] = alist[j],alist[min_index]
if __name__ == '__main__':
	alist = [1,5,3,4,7,2]
	select_sort(alist)
	print(alist)

选择排序:
时间复杂度:o(n^2)
最优时间复杂度 :o(n^2)
算法稳定性:不稳定算法

4.4 插入排序

插入排序:将一个数据插入到已经排好序的有序数据中,从而得到一个新的,个数加一的有序数据,算法适用于少量数据的排序。排序时将第一个数作为有序数据
在这里插入图片描述

def insert_sort(alist):
	"""插入排序"""
	n = len(alist) #列表长度
	for j in range(1,n): #控制轮数
		for i in range(j,0,-1):#找到合适的位置安放我们的无序数据[j,j-1,j-2,...1]
			if alist[i]<alist[i-1]:
				alist[i],alist[i-1] =alist[i-1],alist[i]
			else:
				break
if __name__ == '__main__':
	alist = [1,5,3,4,7,2]
	insert_sort(alist)
	print(alist)

插入排序:
时间复杂度:o(n^2) – 降序数据变成升序
最优时间复杂度 :o(n) – 原本就是升序数据
算法稳定性:稳定算法 (if alist[i]<alist[i+1]中如果是<= ,则不是稳定算法)

4.5 快速排序

在这里插入图片描述
在这里插入图片描述

def quick_sort(alist,start,end):
	"""快速排序"""
	#递归的结束条件
	if start>=end:
		return 
	#界限值
	mid = alist[start]
	#左右游标
	left = start
	right = end
	while left <right:
		while alist[right]>=mid and left<right : #从右边开始找寻小于mid的值,归类到左边
			right -=1
		slist[left] = alist[right]
		while alist[left]<mid and left<right:
			left +=1
		slist[right] = alist[left]
	#循环一旦结束了,证明找到了mid应该在的位置
	alist[left] = mid
	#递归操作
	quick_sort(alist,start,left-1)
	quick_sort(alist,right+1,end)
if __name__ == '__main__':
	alist = [1,5,3,4,7,2]
	quick_sort(alist,0,len(alist)-1)
	print(alist)

快速排序:
时间复杂度:o(n^2)
最优时间复杂度 :o(nlogn)
在这里插入图片描述

算法稳定性:不稳定算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑盒测试用例设计 - 功能图法

目录功能图法原理介绍功能图法步骤案例&#xff1a;以QQ登录界面为例功能图法原理介绍 功能图方法其实是一种灰盒测试&#xff08;因其兼有黑盒和白盒测试&#xff09;用例设计方法&#xff1b;通常情况一个程序的功能说明通常由动态说明和静态说明组成&#xff0c;动态说明描…

UG/NX 二次开发(C#)自动出2D零件图思路

一、前言 项目需要自动出2D零件图&#xff0c;可是我之前没做过这方面的内容&#xff0c;没有一点思路。然后我就做了下面几件事&#xff1a; 1、百度、google翻了一遍&#xff0c;搜索关键字“UG二次开发自动出图” 2、csdn.com 和 cnblogs.com翻了一遍 3、平时逛的qq技术…

数字图像处理(第四版)-冈萨雷斯-学习过程的笔记

作者介绍1.绪论自己读书存在一个问题&#xff0c;书太厚&#xff0c;重点难以把握&#xff0c;对如此经典的书籍&#xff0c;希望自己的学习历程和重点记录下来。 目前在持续更新和学习中&#xff0c;觉得有帮助的话可以先收藏和关注我博客的内容--更新于2023/1/102.数字图像基…

C语言进阶——自定义类型——结构体

目录 一. 结构体类型的声明 结构体的声明 特殊的声明 二. 结构的自引用 三. 结构体变量的定义和初始化 定义 初始化 四. 结构体内存对齐 未完待续 一. 结构体类型的声明 结构体的声明 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以…

08-Alibaba微服务组件Nacos配置中心实战源码分析

Nacos配置中心源码分析 Config相关配置 Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串&#xff0c;公共命名空间&#xff08;public&#xff09;&#xff0c;分组默认是DEFAULT_GROUP 配置中心的架构 nacos config client源码分析 获取配置 获取配置的主要方…

windows配置java环境

windows配置java环境下载JDK安装JDK配置环境变量java9及以上版本配置环境变量&#xff08;以java17为例&#xff0c;只需要配置JAVA_HOME和Path变量&#xff09;配置JAVA_HOME变量配置Path变量java8及以下版本配置环境变量&#xff08;以java8为例&#xff0c;需要配置JAVA_HOM…

Unity官方本地化插件localization

官方文档地址&#xff1a;https://docs.unity3d.com/Packages/com.unity.localization1.0/manual/QuickStartGuideWithVariants.html 使用流程 安装 PackageManager搜索Localization完成对应插件的安装 配置 PlayerSetting->Localization 创建本地化相关配置 创建之后点…

python的安装以及pycharm的配置

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a;lqj_本人的博客_CSDN博客-微信小程序,html特效,vue2基础领域博主 哔哩哔哩欢迎关注&#xff1a;小淼前端 小淼前端的个人空间_哔哩哔哩_bilibili 本篇文章主要讲述python的安装以及pych…

【Linux】小程序进度条

目录回车换行问题日常中的换行代码中的回车换行倒计时函数进度条回车换行问题 日常中的换行 即&#xff1a; 回车&#xff1a;回到当前行的最开始 换行&#xff1a;列不变&#xff0c;新起一行 代码中的回车换行 我们先看一段代码&#xff1a; 这个是带\n的 &#x1f30d;结…

什么是运动神经元 你们真的知道吗

大家好&#xff0c;你们知道什么运动神经元吗&#xff0c;你们有误入这些误区吗&#xff1f; 运动神经元是一种神秘的疾病&#xff0c;导致的原因尚且不明确。这种疾病的发生可能是体内的运动神经元细胞的减少或是凋亡导致的&#xff0c;是一种慢性发展的神经类疾病。虽然导致运…

【晶振】NTP网络校时服务器(卫星时钟)电路里的主心跳

【晶振】NTP网络校时服务器&#xff08;卫星时钟&#xff09;电路里的主心跳 【晶振】NTP网络校时服务器&#xff08;卫星时钟&#xff09;电路里的主心跳 晶振是NTP网络校时服务器&#xff08;卫星时钟&#xff09;电路板数字电路的&#xff02;心跳&#xff02;&#xff0c;在…

阿狸(Hans设计卡通形象)的幸福生活 ---- 充满趣味性(可自定义更改)

Ali the fox 目录 一、前言 二、关于代码 三、效果展示 四、详细介绍 五、编码实现 index.html css 文件夹 88rh.css js 文件夹 img 文件夹 fonts 文件夹 六、获取源码 需要源码&#xff0c;可以私信我(⊙o⊙)&#xff1f;关注我&#xff1f; 一、前言 时光荏苒&…

MyBatis­Plus快速入门

介绍 MyBatisPlus&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 特性&#xff1a; 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xf…

冰冰学习笔记:异常处理

欢迎各位大佬光临本文章&#xff01;&#xff01;&#xff01; 还请各位大佬提出宝贵的意见&#xff0c;如发现文章错误请联系冰冰&#xff0c;冰冰一定会虚心接受&#xff0c;及时改正。 本系列文章为冰冰学习编程的学习笔记&#xff0c;如果对您也有帮助&#xff0c;还请各位…

Github-Action-Workflow-概念和基本操作

workflow 文件 GitHub Actions 的配置文件叫做 workflow文件&#xff0c;存放在代码仓库的.github/workflows/目录下。比如写一个first.yaml文件&#xff0c;存储的目录就是.github/workflows/first.yaml workflow/下的文件采用 YAML 格式&#xff0c;文件名可以任意取&#xf…

代码随想录第56天|● 583. 两个字符串的删除操作 ● 72. 编辑距离

583.两个字符串的删除操作 思路一 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数。 当word1[i - 1] 与 word2[j - 1]相同的时候 dp[i][j] dp[i - 1][j - 1];当word1[…

检修盒面板AI视觉检测系统,赋能工业发展!

制造业是中国工业化的源头&#xff0c;也是工业生产大国。任何一步的质量都可能影响生产过程的变化。表面缺陷不仅影响产品的美观和舒适性&#xff0c;还会对其性能产生不良影响。因此&#xff0c;制造商对产品的表面缺陷检测非常重视。传统的检修盒面板按钮安装是否正确的质量…

【深度学习】CNN应用于图像分类的建模全流程

文章目录1.摘要2.图片的准备及预处理3.打包并保存数据4.搭建模型5.训练模型6.测试模型7.总结1.摘要 图像分类&#xff0c;也可以称作图像识别&#xff0c;顾名思义&#xff0c;就是辨别图像中的物体属于什么类别。核心是从给定的分类集合中给图像分配一个标签的任务。实际上&a…

DBeaver连接InterSystems IRIS、Ensemble、Cache操作说明

一、驱动获取 1.1、本地安装目录获取 JDBC驱动&#xff1a;“安装目录\dev\java\lib\JDK18” 如需获取ODBC等其他连接驱动则返回“安装目录\dev”路径选择对应文件夹2.1、Intersystems官方获取 官方下载&#xff1a;https://intersystems-community.github.io/iris-driver-…

深度学习基本部件-激活函数详解

激活函数概述 前言激活函数定义激活函数性质 Sigmoid 型函数 Sigmoid 函数Tanh 函数 ReLU 函数及其变体 ReLU 函数Leaky ReLU/PReLU/ELU/Softplus 函数 Swish 函数激活函数总结参考资料 本文分析了激活函数对于神经网络的必要性&#xff0c;同时讲解了几种常见的激活函数的原理…