数据结构和算法
文章平均质量分 88
埃菲尔没有塔尖
热爱学习,热爱分享,欢迎交流。
展开
-
用Python实现冒泡排序
冒泡排序(英语:Bubble Sort)是⼀种简单的排序算法。它重复地遍历要排序的数列,⼀次⽐较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的⼯作是重复地进⾏直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越⼩的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序算法的运作如下:⽐较相邻的元素。如果第⼀个⽐第⼆个⼤(升序),就交换他们两 个。 对每⼀对相邻...原创 2018-12-16 17:58:22 · 546 阅读 · 0 评论 -
用Python实现优先级队列
提出问题:假设我们想要实现一个队列,它能够以指定的优先级对元素排序,并且每次pop()弹出都时优先级最高的那个元素。解决思路:首先,我们必须清楚队列的概念,就是所谓的“先进先出”,然后可以使用heapq模块构建一个简答的优先级队列。具操作看下面代码:import heapqclass PQueue: def __init__(self): self._queue...原创 2019-01-26 18:02:01 · 1365 阅读 · 0 评论 -
Python从N个数中找到最大的K个数
提出问题:如何在某集合里面找出最大或最小的N个元素。解决思路:找出最大或最下的N个元素,可以使用Python库中的heapq模块,该模块提供两个函数nlargest()求最大N个和nsmallest()求最小N个。下面我们举例说明:import heapqnums=[12,-9,-3,32,9,56,23,0,11,34]print(heapq.nlargest(4,nums)) ...原创 2019-01-25 14:02:23 · 4783 阅读 · 3 评论 -
Python保存最后N个元素
提出问题:有时候,我们希望能在迭代或者其他处理过程中,保留最后几个符合要求的内容记录。解决思路:保存最后N个元素或者有限历史记录,可以用到collections.deque方法。例如,在一个文件里面查找,符合要求的文字,当发现有成功匹配的就输出当前的匹配行以及最后检查过的N行文本。from collections import deque #导入deque模块def search(li...原创 2019-01-24 12:37:25 · 1344 阅读 · 2 评论 -
Python将序列分解为单独的变量
提出问题:假设我们有一个包含N个元素的元组或者序列,现在想将它分解为N个单独的变量。解决思路:任何序列或者是可迭代的对象,都可以通过一个简单的赋值操作来分解为单独的变量下面是例子,请看:但是如果元素的数量不匹配,就会报错。深入讨论:其实,在我们分解元素的时候,不仅仅是元组或者列表,只要对象是可迭代的,那么就可以执行分解操作。包括字符串,文件,迭代器和生成器等。有时候,在我们...原创 2019-01-24 11:31:52 · 419 阅读 · 0 评论 -
用Python实现二叉树的遍历
⼆叉树的遍历树的遍历是树的⼀种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问⼀次且仅访问⼀次,我们把这种对所有节点的访问称为遍历(traversal)。那么树的两种重要的遍历模式是深度优先遍历,⼴度优先遍历,深度优先⼀般⽤递归,⼴度优先⼀般⽤队列。⼀般情况下能⽤递归实现的算法⼤部分也能⽤堆栈来实现。深度优先遍历对于⼀颗⼆叉树,深度优先搜索(Depth Firs...原创 2018-12-17 09:41:30 · 237 阅读 · 0 评论 -
用Python实现二叉树,完全二叉树和满二叉树
⼆叉树的基本概念⼆叉树是每个节点最多有两个⼦树的树结构。通常⼦树被称作“左⼦树”(left subtree)和“右⼦树”(right subtree)⼆叉树的性质(特性)性质1: 在⼆叉树的第i层上⾄多有2^(i-1)个结点(i>0)性质2: 深度为k的⼆叉树⾄多有2^k - 1个结点(k>0)性质3:对于任意⼀棵⼆叉树,如果其叶结点数为N0,⽽度数为2的结点总 数为N2,...原创 2018-12-17 09:23:46 · 3044 阅读 · 0 评论 -
用Python实现单向链表
单向链表单向链表也叫单链表,是链表中最简单的⼀种形式,它的每个节点包含两个域,⼀个信息域(元素域)和⼀个链接域。这个链接指向链表中的下⼀个节点,⽽最后⼀个节点的链接域则指向⼀个空值。表元素域elem⽤来存放具体的数据。链接域next⽤来存放下⼀个节点的位置(python中的标识)变量p指向链表的头节点(⾸节点)的位置,从p出发能找到表中的任意节点。节点实现class Single...原创 2018-12-17 08:52:07 · 1063 阅读 · 1 评论 -
用Python实现双端队列
双端队列双端队列(deque,全名double-ended queue),是⼀种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插⼊和删除操作在表的两端进⾏。双端队列可以在队列任意⼀端⼊队和出队。操作Deque() 创建⼀个空的双端队列add_front(item) 从队头加⼊⼀个item元素add_rear(item)从队尾加⼊⼀个item元素remov...原创 2018-12-16 19:57:18 · 238 阅读 · 0 评论 -
用Python实现队列
队列的实现同栈⼀样,队列也可以⽤顺序表或者链表实现。操作Queue() 创建⼀个空的队列enqueue(item) 往队列中添加⼀个item元素dequeue() 从队列头部删除⼀个元素is_empty() 判断⼀个队列是否为空size() 返回队列的⼤⼩代码的实现:class Queue(object): """队列&原创 2018-12-16 19:50:08 · 248 阅读 · 0 评论 -
用Python实现栈
栈(stack),有些地⽅称为堆栈,是⼀种容器,可存⼊数据元素、访问元素、删除元素,它的特点在于只能允许在容器的⼀端(称为栈顶端指标,英语:top)进⾏加⼊数据(英语:push)和输出数据(英语:pop)的运算。有了位置概念,保证任何时候可以访问、删除的元素都是此前最后存⼊的那个元素,确定了⼀种默认的访问顺序。由于栈数据结构只允许在⼀端进⾏操作,因⽽按照后进先出(LIFO, Last In Fi...原创 2018-12-16 19:15:04 · 208 阅读 · 2 评论 -
用Python实现希尔排序
希尔排序希尔排序(Shell Sort)是插⼊排序的⼀种。也称缩⼩增量排序,是直接插⼊排序算法的⼀种更⾼效的改进版本。希尔排序是⾮稳定排序算法。该⽅法因DL.Shell于1959年提出⽽得名。 希尔排序是把记录按下标的⼀定增量分组,对每组使⽤直接插⼊排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减⾄1时,整个⽂件恰被分成⼀组,算法便终⽌。希尔排序过程希尔排序的基本思想是:将...原创 2018-12-16 18:57:56 · 195 阅读 · 0 评论 -
常见排序算法效率比较
常⻅排序算法效率⽐较原创 2018-12-16 18:45:08 · 1519 阅读 · 0 评论 -
用Python实现归并排序
归并排序归并排序是采⽤分治法的⼀个⾮常典型的应⽤。归并排序的思想就是先递归分解数组,再合并数组。将数组分解最⼩之后,然后合并两个有序数组,基本思路是⽐较两个数组的最前⾯的数,谁⼩就先取谁,取了后相应的指针就往后移⼀位。然后再⽐较,直⾄⼀个数组为空,最后把另⼀个数组的剩余部分复制过来即可。归并排序的分析代码实现:def merge_sort(alist): if len(alist) ...原创 2018-12-16 18:42:36 · 245 阅读 · 0 评论 -
用Python实现插⼊排序
插⼊排序插⼊排序(英语:Insertion Sort)是⼀种简单直观的排序算法。它的⼯作原是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到应位置并插⼊。插⼊排序在实现上,在从后向前扫描过程中,需要反复把已排元素逐步向后挪位,为最新元素提供插⼊空间。插⼊排序分析代码实现:def insert_sort(alist): # 从第⼆个位置,即下标为1的元素开始向前插⼊...原创 2018-12-16 18:33:38 · 555 阅读 · 0 评论 -
用Python实现选择排序
选择排序选择排序(Selection sort)是⼀种简单直观的排序算法。它的⼯作原理如下。⾸先在未排序序列中找到最⼩(⼤)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最⼩(⼤)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换⼀对元素,它们当中⾄少...原创 2018-12-16 18:26:43 · 298 阅读 · 0 评论 -
用Python实现快速排序
快速排序快速排序(英语:Quicksort),⼜称划分交换排序(partitionexchangesort),通过⼀趟排序将要排序的数据分割成独⽴的两部分,其中⼀部分的所有数据都⽐另外⼀部分的所有数据都要⼩,然后再按此⽅法对这两部分数据分别进⾏快速排序,整个排序过程可以递归进⾏,以此达到整个数据变成有序序列。步骤为:从数列中挑出⼀个元素,称为"基准"(pivot),重新排序数列,所有元素...原创 2018-12-16 18:15:59 · 331 阅读 · 2 评论 -
Python实现二分查找
要想使用二分查找,前提必须是元素有序排列方法1:递归实现def binary_search(alist,item): """二分查找---递归实现""" n = len(alist) if n > 0: mid = n//2 #数组长度的一半中间下标 if item == alist[mid] : ...原创 2019-06-28 15:01:43 · 883 阅读 · 0 评论