数据结构与算法
七月听雪
这个作者很懒,什么都没留下…
展开
-
经典排序综述
https://www.cnblogs.com/onepixel/p/7674659.html#4490972原创 2020-03-13 08:52:22 · 118 阅读 · 0 评论 -
希尔排序
def shell_sort(alist): """希尔排序""" n = len(alist) gap = n // 2 while gap >= 1: # 注意:这里和动图演示的不一样,动图是分组执行,实际操作是多个分组交替执行 for j in range(gap, n): i =...原创 2020-03-12 21:15:20 · 133 阅读 · 0 评论 -
选择排序
def selectSort(arr): for i in range(len(arr)): minIndex = i for j in range(i+1,len(arr)): if arr[j]<arr[minIndex]: minIndex = j arr[i]...原创 2020-03-12 20:03:55 · 99 阅读 · 0 评论 -
基数排序
def radix_sort(s): """基数排序""" i = 0 # 记录当前正在排拿一位,最低位为1 max_num = max(s) # 最大值 j = len(str(max_num)) # 记录最大值的位数 while i < j: bucket_list =[[] for _ in range(...原创 2020-03-12 18:45:21 · 94 阅读 · 0 评论 -
计数排序
def countingSort(arr): # the elements in the array are all integers maximum, minimum = max(arr), min(arr) countArr = [0] * (maximum - minimum + 1) # 建立额外的空间 for i in arr...原创 2020-03-12 14:20:43 · 107 阅读 · 0 评论 -
桶排序
def bucktetSort(numList,bucketNum): if len(numList) == 0 or len(numList) == 1: return numList maxNum = numList[0] minNum = numList[0] for i in range(1,len(numList)): # ...原创 2020-03-12 10:59:04 · 139 阅读 · 0 评论 -
插入排序
def insert(a): for i in range(1,len(arr)): j=i-1 tmp = arr[i] while j>=0 and arr[j]>tmp: arr[j+1]=arr[j] j-=1 arr[j+1]=tmp ...原创 2020-03-11 19:47:38 · 100 阅读 · 0 评论 -
leetcode35. 搜索插入位置 二叉搜索法
二叉搜索有闭区间和左闭右开区间的两种方法:闭区间模板:左闭右开区间模板:class Solution(object): def searchInsert(self, nums, target): """ :type nums: List[int] :type target: int :rtype: ...原创 2020-02-23 18:52:32 · 119 阅读 · 0 评论 -
堆和堆排序
堆的定义: 堆是 1. 一个近似完全二叉树的结构, 2. 并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序:堆排序的原理: 堆排序是利用数组实现的。大根堆和小根堆:堆排序的步骤:根据堆的性质(以最大堆举例):堆的根节点肯定是所有数据中最大的,但是他的所有子结点不是完全有序的...原创 2020-02-12 15:14:49 · 176 阅读 · 0 评论 -
优先队列
队列的定义:队列的实现: 高级实现:用堆实现。(优先队列一般都是利用队列实现的,所以一般把优先队列也称为堆。)堆的定义:堆实现优先队列:https://www.cnblogs.com/aiguozou/p/11407131.html...原创 2020-02-11 12:47:11 · 108 阅读 · 0 评论 -
二叉树后序遍历的四种方法
两个栈:# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution(object)...原创 2020-01-09 22:03:26 · 1642 阅读 · 0 评论 -
回溯法
话说之前,说法就是向前探索,如果探索不下去,就往回走,然后选新的探索方向,类似于迷宫的求解。其实呢,这只是回溯法里面搜索方式,不是它的本质。首先啊,把解空间转化为树的结构,在树中,用DFS搜索求解,在遍历的过程中剪枝。所谓的往回退,就是搜索到不符合条件的叶子节点,就退出搜索。就是之前那种往回退的意思。其实回溯就是递归调用的返回。回溯的实现方法和DFS一样有两种:递归和迭代。回溯一般用递...原创 2019-12-19 21:10:36 · 191 阅读 · 0 评论 -
dfs和bfs
https://www.cnblogs.com/wzl19981116/p/9397203.html原创 2019-11-25 17:05:07 · 136 阅读 · 0 评论 -
二叉树非递归遍历
前序遍历: 前序遍历的规则是根结点-->左子树-->右子树。也就是从根结点开始一直找他的左子树,在左子树里也是根结点-->左子树-->右子树的规则,所以就是一直找根结点的左子结点,直到找不到左子结点,这时候就应该去遍历它的右子树了。def preOrder(self, root): if root == None: return ...原创 2019-09-11 11:19:19 · 86 阅读 · 0 评论 -
快速排序
快排是四处游走必会的。基本概念: 快排是对冒泡排序的优化,基于分治的思想。二者都是交换排序,通过交换元素的位置来排序的,与归并排序不同的是快排不用声明一个新的空间来保存中间结果。 冒泡排序在每一轮只把一个元素冒泡到数列的一端,而快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成了两个部分。原...原创 2019-08-28 16:18:35 · 120 阅读 · 0 评论 -
数据结构——图
图的概念:图就是有若干结点和若干它们之间的边组成的(不是任意两个结点都必须连在一起)。其实所有的数据结构都是一种图,比如链表就是一种一维的图。图是一种对现实世界的模拟,世界由若干实体和它们之间的关系组成。图也是一种网络,比如高铁路线就是图。不管是什么时候遇到困难的编程问题,问一问自己:“如何用图来表述这个问题?”。图都是用于表示数据之间的关系。 诀窍在于如何定义“关系”。图的代码实现:...原创 2019-08-23 10:38:28 · 204 阅读 · 0 评论 -
拓扑排序
拓扑排序的定义:拓扑排序是在有向无环图(DAG)里按指向关系弹出一个序列,比如A->B,在序列里A就要在B的前面。官方定义:由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。拓扑排序的性质:每个顶点出现且只出现一次。 若A在序列中排在B的前面,则在图中不存在从B到A的路径。 DAG图必然存在一个拓扑排序。 拓扑排序的序列不一定唯一。拓扑排序的实现:...原创 2019-08-23 11:27:30 · 305 阅读 · 0 评论 -
动态规划
https://leetcode-cn.com/problems/coin-change/solution/dong-tai-gui-hua-tao-lu-xiang-jie-by-wei-lai-bu-ke/动态规划遵顼一个固定流程:递归暴力解法 ->带备忘录的递归解法->非递归的动态规划解法。以斐波那契数列为例:递归解法def fib(n): if (n=...原创 2019-08-24 10:03:17 · 283 阅读 · 0 评论 -
102. 二叉树的层次遍历
递归:用队列维护,当一层结点要出队列之前,要保存队列的长度也就是某一层的结点数。出队列时候只出保存的结点数个结点。PythonJavaclass Solution: def levelOrder(self, root): """ :type root: TreeNode :rtype: List[List[int]] ...原创 2019-09-10 16:38:57 · 112 阅读 · 0 评论 -
107. 二叉树的层次遍历 II
其实就是把每层保存的顺序变化一下。# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:...原创 2019-09-10 16:54:58 · 99 阅读 · 0 评论 -
113. 路径总和 II
# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def pathSum(se...原创 2019-09-10 19:19:15 · 99 阅读 · 0 评论 -
104. 二叉树的最大深度
# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def maxDepth(s...原创 2019-09-10 19:29:32 · 90 阅读 · 0 评论 -
98. 验证二叉搜索树
非递归的中序遍历:# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def...原创 2019-09-10 21:25:08 · 68 阅读 · 1 评论 -
归并排序
核心思想:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案”修补”在一起,即分而治之)。思路简图:实例示意图:1.整体过程示意图:2.合并(治)示意图:...原创 2019-08-26 22:29:39 · 130 阅读 · 0 评论