文章分类 -  数据结构与算法入门 python版

摘要:二叉搜索树是一颗二叉树且满足性质: 设x是二叉树的一个节点。如果y是x左子树的一个节点,那么y.key ≤ x.key; 如果y是x右子树的一个节点,那么y.key > xkey。 对于根节点,左子树中所有节点的值 < 根节点的值 < 右子树中所有节点的值,任意节点的左、右子树也是二叉搜索树,同样满 阅读全文
posted @ 2023-06-16 20:15 天才九少 阅读(15) 评论(0) 推荐(0) 编辑
摘要:正文 树 二叉树 树 树是一种可以递归定义的数据结构,例如目录结构 树是由n个节点组成的集合:如果n=0,那么就是一颗空树;如果n>0,那么存在1个节点作为树的根节点,其他节点可以分为m个集合,每个集合本身又是一颗树。 一些基本概念: 根节点:根结点为第1层,例如A 叶子节点:例如B、H、P等 树的 阅读全文
posted @ 2023-06-16 20:04 天才九少 阅读(25) 评论(0) 推荐(0) 编辑
摘要:「链表 Linked List」是一种线性数据结构,其中每个节点都是单独的对象,各个节点之间通过指针连接。 每个节点包括两部分:一是结点「值 Value」,二是指向下一结点的「指针 Pointer」 # 节点 class Node: def __init__(self, item): self.it 阅读全文
posted @ 2023-06-14 23:35 天才九少 阅读(35) 评论(0) 推荐(0) 编辑
摘要:给一个二维列表,表示迷宫(0表示通道,1表示围墙)。给出一条走出迷宫的路径 队列-广度优先搜索,使用队列存储当前正在考虑的节点(仅存储当前节点),从一个节点开始,寻找所有接下来能继续走的点,继续不断寻找直到找到出口 难点:这里用一个新的列表path存储了出队的元素,并在queue中用第三个位置记录了 阅读全文
posted @ 2023-06-14 21:21 天才九少 阅读(28) 评论(0) 推荐(0) 编辑
摘要:给一个二维列表,表示迷宫(0表示通道,1表示围墙)。给出一条走出迷宫的路径 栈-深度优先搜索,回溯法思路:使用栈存储当前路径,从一个节点出发,任意找一个能走的点,当找到不能找的点时,退回上一个点寻找是否有其他方向的点(出栈)。 # 深度优先搜索 又称回溯法 maze = [ [1, 1, 1, 1, 阅读全文
posted @ 2023-06-14 21:12 天才九少 阅读(24) 评论(0) 推荐(0) 编辑
摘要:「队列 Queue」是一种遵循「先入先出 first in, first out」数据操作规则的线性数据结构 队列的实现方式:环形队列(队列不能用列表简单实现,因此采用环形队列) 基于数组 基于链表 环形队列: size:队列的长度 front:队首指针 rear:队尾指针 队首指针前进1:fron 阅读全文
posted @ 2023-06-14 20:56 天才九少 阅读(32) 评论(0) 推荐(0) 编辑
摘要:括号匹配问题 算法分析 初始化一个空栈,顺序读入括号 若是右括号则与栈顶元素进行匹配(#若匹配,则弹出栈顶元素并进行下一元素 #若不匹配,则该序列不合法)栈顶一定是最里层的那个 若是左括号,则压入栈中 若全部元素遍历完毕,栈中仍然存在元素,则该序列不合法 # 栈 class ArrayStack: 阅读全文
posted @ 2023-06-12 20:09 天才九少 阅读(17) 评论(0) 推荐(0) 编辑
摘要:栈 Stack」是一种遵循「先入后出 first in, last out」数据操作规则的线性数据结构。 栈的两种实现方式: 基于数组 基于链表 基于数组 class ArrayStack: """ 基于数组实现的栈 """ def __init__(self): """ 构造方法 """ self 阅读全文
posted @ 2023-06-12 19:58 天才九少 阅读(8) 评论(0) 推荐(0) 编辑
摘要:基数排序(Radix Sort),列表最大值有几位数,就按几次进行分桶装桶,通过不停的分桶和装桶来实现排序,桶里面不需要排序,因为桶已经是有序的了。 第一次按照个位数进行分桶,分桶完毕桶里面的数按个位数是排好序的,然后进行第二轮按百位数进行分桶,这时列表已经是按个位数排好序的,然后依次分到按百位数排 阅读全文
posted @ 2023-06-12 19:24 天才九少 阅读(44) 评论(0) 推荐(0) 编辑
摘要:桶排序(Bucket sort),是计数排序的升级版,若元素的范围比较大(比如1到1亿之间),则使用桶排序,即将数据分到有限数量的桶子里,然后对每个桶里的元素进行排序 def bucket_sort(li, n=100, max_num=10000): # n为分桶数量,max_num要大于列表li 阅读全文
posted @ 2023-06-12 18:41 天才九少 阅读(44) 评论(0) 推荐(0) 编辑
摘要:计数排序(Counting sort),是一种 非比较 的排序算法,需要开辟一个新的至少 与待排序列表中最大数 大 的数组空间,并记录待排序列表中数字出现的次数,然后将这个次数作为键存储在新的数组空间中以达到排序的效果 def count_sort(li, max_num=100): # max_n 阅读全文
posted @ 2023-06-12 18:26 天才九少 阅读(22) 评论(0) 推荐(0) 编辑
摘要:希尔排序(Shell Sort),是将列表按某一规则(如d=len(li)//2)进行分组,然后对每组使用插入排序算法,接着再进行分组(d//2),然后对每组进行插入排序,直到分组等于d=1,排序完毕。希尔排序的每一次分组都会使得局部变得更有序,直到整体有序。 def insert_gap(li, 阅读全文
posted @ 2023-06-12 16:58 天才九少 阅读(30) 评论(0) 推荐(0) 编辑
摘要:归并排序(Merge sort),对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终使所有的元素都是有序 # 归并 def merge(li, low, mid, high): i = low j = mid + 1 ltmp = [] while i <= 阅读全文
posted @ 2023-06-10 18:04 天才九少 阅读(27) 评论(0) 推荐(0) 编辑
摘要:堆排序(Heapsort)是利用二叉堆的概念来排序: # 堆的向下调整函数(大根堆)def sift(li, low, high): """li:列表,low:堆的根节点位置,high:堆的最后一个元素的位置""" i = low # i 最开始指向根节点 j = 2 * i + 1 # j开始是左 阅读全文
posted @ 2023-06-10 17:35 天才九少 阅读(11) 评论(0) 推荐(0) 编辑
摘要:快速排序(Quick Sort)分为两部分:归位,递归。 归位:在每一轮挑选一个 数,将数列分成两部分,比它大的 数 移动到数列 右边,比它小的 数 移动到数列的 左边 递归:然后这个数的右边部分和左边部分重复上个过程,一直递归到所有数都排好序。 代码实现 # 归位函数def partition(l 阅读全文
posted @ 2023-06-08 07:08 天才九少 阅读(24) 评论(0) 推荐(0) 编辑
摘要:插入排序(Insertion Sort),初始 有序区 只有一个数,每次从 无序区 取一个数与 有序区 比较,然后在 有序区 中从后向前扫描,并插入有序区的正确位置。 代码实现 def insert_sort(li): for i in range(1, len(li)): # 遍历无序区 tmp 阅读全文
posted @ 2023-06-08 05:46 天才九少 阅读(157) 评论(0) 推荐(0) 编辑
摘要:选择排序(Selection sort): 每一趟从列表 无序区 元素中选择最小的一个元素作为首元素,再一趟选择列表无序区最小的数放到第二个位置上,直到排完为止 选择排序简单易懂的形式: def select_sort_simple(li): li_new = [] # 创建新列表 for i in 阅读全文
posted @ 2023-06-06 22:05 天才九少 阅读(22) 评论(0) 推荐(0) 编辑
摘要:冒泡排序(Bubble Sort):列表相邻的数,如果前面的比后面的大,则交换这两个数。 代码实现: def bubble_sort(li): # li为列表 for i in range(len(li)-1) # 只需列表长度减1趟,最后一趟已排好序 for j in range(len(li)- 阅读全文
posted @ 2023-06-06 21:47 天才九少 阅读(15) 评论(0) 推荐(0) 编辑
摘要:二分查找:从有序列表的初始候选区li[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。 代码实现: # 二分查找 双闭区间 def binary_search(li, val): left = 0 # 列表左下标 right = len(li) - 1 # 列表右下标 wh 阅读全文
posted @ 2023-06-06 21:33 天才九少 阅读(15) 评论(0) 推荐(0) 编辑
摘要:顺序查找(线性查找): 从列表第一个元素开始,顺序进行查找,直到找到元素或搜索到最后一个元素为止 def linear_search(li,val): # li为列表,val为要查找的元素 for i in range(len(li)): if li[i] == val: return i retu 阅读全文
posted @ 2023-06-06 21:22 天才九少 阅读(32) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示