顺序表和链表都是线性表,线性数据

stack,也叫堆栈,是一种容器,可存入元素、访问元素、删除元素,特点是只允许在容器的一端(栈顶,top)进行加入数据(压栈,push)和输出数据(pop),按照后进先出(LIFO,last in first out)的原理运作。

栈的实现

class Stack(object):"""栈"""def __init__(self):self.__list = []def push(self, item):"""添加一个新的元素item到栈顶"""return self.__list.append(item)def pop(self):"""弹出栈顶元素"""return self.__list.pop( )def peek(self):"""返回栈顶元素"""if self.__list:return self.__list[-1]else:return Nonedef is_empty(self):"""判断栈是否为空"""# return self.__list 不可以这样写,调用is_empty直接使用内部列表了# 空列表代表是假,"",{},(),[]都是假return self.__list == []def size(self):"""返回栈的元素个数"""return len(self.__list)if __name__=="__main__":s = Stack()s.push(1)s.push(2)s.push(3)s.push(4)print(s.pop())print(s.pop())print(s.pop())print(s.pop())

队列

也是线性容器,只能从一端添加,从另一端去取,排队,先进先出

class Queue(object):"""队列"""def __init__(self):self.__list = []def enqueue(self, item):"""往队列中添加一个item元素"""self.__list.append(item)def dequeue(self):"""从队列头部删除一个元素"""return self.__list.pop(0)def is_empty(self):"""判断一个队列是否为空"""return self.__list == []def size(self):"""返回队列的大小"""return len(self.__list)if __name__=="__main__":s = Queue()s.enqueue(1)s.enqueue(2)s.enqueue(3)s.enqueue(4)print(s.dequeue())print(s.dequeue())print(s.dequeue())print(s.dequeue())

排序算法

sorting algorithm 将一串数据按特定顺序进行排序的算法

排序算法的稳定性,稳定排序算法会让原本有相等键值的纪录维持相对次序。

冒泡排序

def bubble_sort(alist):"""冒泡排序"""n = len(alist)for j in range(len(alist)-1,0,-1):for i in range(j):if alist[i] > alist[i+1]:alist[i],alist[i+1] = alist[i+1],alist[i]li = [54,26,93,17,77,31,44,55,20]
bubble_sort(li)
print(li)

选择排序

它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

def select_sort(alist):n = len(alist)for i in range(n-1):min_index = ifor j in range(i+1, n):if alist[j] < alist[min_index]:min_index = j# 如果选择的数据不在正确位置,进行交换if min_index != i:alist[i], alist[min_index] = alist[min_index], alist[i]alist = [12,1,54,22,31,3]
select_sort(alist)
print(alist)

插入排序

insertion sort ,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

左边有序,右边无序,从右边取出第一个往左边挪,从右往左依次比较确定自己的位置。

def insert_sort(alist):"""插入元素"""#第二个位置开始往前插入,下标为1for i in range(1,len(alist)):# 从第i个元素开始往前比较,小于前一个,换位置for j in range(i,0,-1):if alist[j] < alist[j-1]:alist[j],alist[j-1] = alist[j-1],alist[j]alist = [54,11,44,35,67,99,5]
insert_sort(alist)
print(alist)

希尔排序

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序的基本思想是:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列(步长更长了,列数更少了)来进行。最后整个表就只有一列了。

def shell_sort(alist):n = len(alist)# 初始步长gap = n//2while gap>0:for i in range(gap, n):j = iwhile j>=gap and alist[j]<alist[j-gap]:alist[j-gap],alist[j] = alist[j],alist[j-gap]gap = gap//2if __name__ == "__main__":alist = [54,26,93,17,77,31,44,55,20]shell_sort(alist)print(alist)

快速排序

quicksort,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。如54,最终结果让54左边的数比54都小,右边的都比54大。

步骤为:

  1. 从数列中挑出一个元素,称为"基准"(pivot),
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

排序代码参考快速排序上的,课件上的太繁琐

def quick_sort(alist):if len(alist) <= 1:return alist# 左边存放小于基准的数字left = []# 右边存放大于基准的数字right = []# 基准数字base = alist.pop()# 对原数组进行划分for i in alist:if i < base:left.append(i)else:right.append(i)# 递归调用return quick_sort(left) + [base] + quick_sort(right)def main():alist = [1,4,7,5,2,8,9,6,3,10]print(quick_sort(alist))
main()

归并排序

采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。

将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。

def merge_sort(alist):if len(alist)<=1:return alistnum = len(alist)//2left = merge_sort(alist[:num])right = merge_sort(alist[num:])# 合并return merge(left, right)def merge(left, right):"""合并操作,将left[]和right[]合并"""# left,right的下标指针l,r = 0,0result = []while l<len(left) and r<len(right):if left[l]<right[r]:result.append(left[l])l += 1else:result.append(right[r])r += 1result += left[l:]result += right[r:]return resultalist = [54,26,93,17,77,31,44,55,20]
sorted_alist = merge_sort(alist)
print(sorted_alist)

常见排序算法比较

搜索

二分查找

也叫折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。条件:有序的顺序表

def binary_search(alist,item):"""二分查找,递归"""n = len(alist)if n>0:mid = n//2if alist[mid]==item:return Trueelif item<alist[mid]:return binary_search(alist[:mid], item)else:return binary_search(alist[mid+1:],item)return Falsedef binary_search_2(alist,item):"""二分查找,非递归"""n = len(alist)first = 0last = n-1while first<=last:mid = (first+last)//2if alist[mid]==item:return Trueelif item<alist[mid]:last = mid -1else:first = mid + 1return Falseif __name__=="__main__":alist = [0, 1, 2, 8, 13, 17, 19, 32, 42, ]print(binary_search(alist, 3))print(binary_search(alist, 13))print(binary_search_2(alist, 3))print(binary_search_2(alist, 13))

时间复杂度

  • 最优时间复杂度:O(1)
  • 最坏时间复杂度:O(logn)

转载于:https://www.cnblogs.com/wangjinliang1991/p/9898899.html

python数据结构和算法3 栈、队列和排序相关推荐

  1. Python数据结构与算法(六)--栈和队列

    栈和队列 栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素.访问元素.删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据( ...

  2. python数据结构与算法:栈

    栈: '''Stack() 创建一个新的空栈 push(item) 添加一个新的元素item到栈顶 pop() 弹出栈顶元素 peek() 返回栈顶元素 is_empty() 判断栈是否为空 size ...

  3. python 熊猫钓鱼_Python数据结构与算法之使用队列解决小猫钓鱼问题

    本文实例讲述了Python数据结构与算法之使用队列解决小猫钓鱼问题.分享给大家供大家参考,具体如下: 按照<啊哈>里的思路实现这道题目,但是和结果不一样,我自己用一幅牌试了一下,发现是我的 ...

  4. Python数据结构与算法(二)栈和队列

    本系列总结了python常用的数据结构和算法,以及一些编程实现. 参考书籍:<数据结构与算法 Python语言实现> [美]Michael T.Goodrich, Roberto Tama ...

  5. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  6. 数据结构与算法--利用栈实现队列

    利用栈实现队列 上一节中说明了栈的特点 后进先出,我们用数组的方式实现了栈的基本操作api,因此我们对栈的操作是不考虑排序的,每个api的操作基本都是O(1)的世界,因为不考虑顺序,所以找最大,最小值 ...

  7. Python数据结构与算法(3.5)——双端队列

    Python数据结构与算法(3.5)--双端队列 0. 学习目标 1. 双端队列的基本概念 1.1 双端队列的基本概念 1.2 双端队列抽象数据类型 2. 双端队列的实现 2.1 顺序双端队列的实现 ...

  8. Python数据结构与算法(3.1)——栈

    Python数据结构与算法(3.1)--栈 0. 学习目标 1. 栈的基本概念 1.1 栈的基本概念 1.2 栈抽象数据类型 1.3 栈的应用场景 2. 栈的实现 2.1 顺序栈的实现 2.2 链栈的 ...

  9. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

最新文章

  1. win2003 vps IIS6中添加站点并绑定域名的配置方法
  2. easyui datagrid 绑定json对象属性的属性
  3. [1维粒子模拟 version3.6]成功调试read input parameters
  4. 用python绘制好看的图形_如何使用Python绘制好word cloud,怎么,画出,好看,的,词,云图...
  5. Xshell、Xftp入门使用
  6. linux编辑文档windows,1.9vim编辑器linux内核的底层文本编辑器,跟windows系统上的文本文档类似,大部分用这个工具进行文本的编辑,这个工具的操作方式基本上用不到鼠标,多是...
  7. nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
  8. Laravel Session 遇到的坑
  9. Linux下Node.js安装及环境配置
  10. Box2D教程5-碰撞检测
  11. JavaScript学习(八十七)—流程控制语句的总结,超级详细!!!
  12. java字段偏移量什么意思_求结构体的字段的偏移量
  13. 计算机组成原理(微课版)谭志虎pdf资源
  14. 【PAT乙级】PAT (Basic Level) Practice (中文)训练记录
  15. 中国水疗产品行业市场供需与战略研究报告
  16. Camera 驱动 读取摄像头ID失败问题、低温下Camera打开花屏或者读不到id、概率性读取不到id
  17. 如何评价吴军《浪潮之巅》?来自反面的声音
  18. 4个步骤:聚类分析如何分析用户?
  19. 什么是RNN?一文看懂强大的循环神经网络(Recurrent Neural Network, RNN)
  20. fcntl(nListenId, F_SETFD, FD_CLOEXEC) 的作用

热门文章

  1. html5 canvas图文编辑器源码_5个微信编辑器,再也不用为公众号发愁啦
  2. MCU提高ADC采样精度的几种方案
  3. 计算机控制的工频机是什么,UPS 如何分类,工频机和高频机区别是什么?
  4. 12 c for. oracle rac,【案例】Oracle RAC FOR AIX搭建执行root.sh时两次报错的解决办法
  5. skywalking 安装_如何使用skywalking 进行全链路监控
  6. 可以发外链的网站_SEO分享:网站推广的四大推广方法
  7. mysql索引分析和优化_MySQL索引分析和优化
  8. php 的cookie设置时间,php cookie时间设置的方法-PHP问题
  9. python垃圾回收价格表_深度解析Python垃圾回收机制(超级详细)
  10. jquery 字符串查找_Python Appium 库IOS特有元素查找API介绍