数据结构
文章平均质量分 58
[奋斗不止]
这个作者很懒,什么都没留下…
展开
-
二叉树从根节点出发的所有路径
按照先序遍历 加 回溯法 实现。二叉树从根节点出发的所有路径。从根节点出发的所有路径 如下。看上图中 二叉树结构。原创 2024-06-29 23:31:20 · 323 阅读 · 0 评论 -
冒泡排序
冒泡排序依次比较相邻两个元素的大小(如从小到大的排序),如果右边元素比左边元素小,则交换他们的元素,直到没有相邻的元素需要交换,则序列排序完成。代码如下: public void BubbleSortFun(int[] arr) { for (int i = 0; i < arr.Length - 1; ++i) { for (int j = 0; j < arr.Length - i - 1; ++j)原创 2021-02-19 15:39:55 · 156 阅读 · 1 评论 -
选择排序算法
选择排序选择排序是一种简单直观的排序算法,原理:第一次从待排序序列中选出最小/最大的元素,将其存放在序列的起始位置,然后再从剩下的序列中找到最小/最大的元素,将其存放到已排序序列的末尾,依次执行,直到待排序序列个数为0,排序结束。图例如下:数组{ 5, 3, 6, 1, 0} 执行选择排序,每一趟遍执行结果代码如下: public void SelectionSortFun(int[] arr) { for (int i = 0; i < arr.Leng原创 2021-02-19 15:36:35 · 208 阅读 · 1 评论 -
插入排序
**插入排序**插入排序又叫直接插入排序,基本思路是将一个数据插入到一个已经排好序的序列中。直到将所有数据添加到有序序列中。实例:序列:0, 2, 5, 6, 10, 2, 5, 6 为已经排好序的有序序列,现将 末尾元素 1,进行排序int[] arr = new int[]{0, 2, 5, 6, 1}int i = 4;int temp = arr[i]; // 待排序数据 arr[4] = 1int j = i - 1; // 既 3; 有序序列最后一个元素 arr[3] =原创 2021-02-08 14:43:33 · 477 阅读 · 1 评论 -
快速排序
快速排序快速排序是分治策略的另一个典型例子,对于任一待排序的序列 S 将其分为前后两个更小的子序列 S1和 S2,并对两个规模更小的序列进行递归的排序。待所有子序列递归的排序结束之后,整个序列S自然编程一个有序的序列。要求 S1 序列中的最大元素必须 小于等于 S2序列中最小的元素 既 Max(S1) <= Min(S2)平凡解:只含有单个元素的序列,本身就是有序序列。以图例展示排序过程如下: public void QuickSort(int[] arr) {原创 2021-02-20 10:10:22 · 204 阅读 · 0 评论 -
归并排序
归并排序归并排序是建立在归并操作上的一种有效,稳定的排序算法。该算法采用分治策略,是分治策略在算法设计中的一个典型应用。归并算法原理:将序列一分为二,子序列递归排序,合并有序子序列,最终的到一个有序的序列。图例分析:上图为归并排序的分割和归并过程。归并原理:分别从两个已排序的序列头部(序列的最小值位置)开始,顺次比较,将较小者写入存储序列,较小者位置向后移动一位,继续与另一个序列的最小值比较,以此轮推,知道将两个序列内的数据全部写入存储序列。如下图:递归实现: public voi原创 2021-02-09 17:33:29 · 160 阅读 · 1 评论 -
希尔排序
希尔排序 希尔排序是插入排序经过改进的一个更高效版本,希尔排序是根据序列下标按照一定步长作为增量进行分组, 对每组使用插入排序算法,通过不断降低步长,每组包含的数据逐渐增多,当步长为 1 时,整个序列 被分为一组,算法终止。实例:序列: 6, 9, 2, 5, 0, 1, 7, 3, 8一:取 增量 gap = length/2,gap/=2, gap > 0gap = 4; 分四组如下6, 9, 2, 5,0, 1, 7, 3,8每组分别进行插原创 2021-02-08 17:48:41 · 156 阅读 · 1 评论 -
计数排序
计数排序计数排序不是一个比较排序算法,时间复杂度为O(N),这是一种以空间换时间的算法。计数排序要求输入的元素必须限制在一定范围内如学生数学成绩(0 - 100 分)原理:通过以元素值为索引下标,将元素写入统计的数组,然后遍历统计数组,顺次将统计数组中的数据取出,放入结果数组。例子如下:七个同学的物理成绩如下:{ 108, 100, 105, 110, 105, 105, 100 }物理成绩区间:[0, 120]开辟一个 120 - 0 + 1 = 121 个空间的数组 int[] cou原创 2021-02-20 12:21:35 · 163 阅读 · 0 评论 -
桶排序
桶排序桶排序类似计数排序,计数排序需要根据序列范围创建一个统计数组,用来统计每个位置整数出现的次数,每个位置只能统计相同元素。而桶排序每个桶表示一个区间范围,可以包含多个元素。如何确定桶的范围,根据实际情况适当分配,下面以统计学生数学成绩 (0 - 100 分)为例子按照每 20分一个桶,则分为五个桶桶1:[0, 20)桶1:[20, 40)桶1:[40, 60)桶1:[60, 80)桶1:[80, 100]假设十个同学成绩如下:{ 73, 30, 90, 89, 78, 10, 93,原创 2021-02-20 18:24:46 · 245 阅读 · 0 评论 -
基数排序算法
基数排序基数排序是一种非比较形的排序算法,是一种稳定排序算法,其原理是将整数按位数(从个位、十位、百位顺序)切割成不同的数字,分别按照位数上的值将元素放到不同的“桶子”中。直到最高位切割完成,则数据排序完成。原理如下图所示代码如下void Start() { int[] arr = new int[] { 543, 159, 343, 287, 694, 315, 873, 96}; RadixSort(arr); } public voi原创 2021-02-20 16:43:19 · 248 阅读 · 1 评论 -
二分查找数字添加位置
二分查找数字添加位置在一个有序数列中查找一个数,如果找到则返回该数的下标,如果找不到则返回该数应该添加的位置。例:数列: 1、3、5、7、9添加:-1结果:数列中没有 -1,应该将 -1 添加到数列第 0 个位置 :-1、1、3、5、7、9例:数列: 1、3、5、7、9添加:1结果:数列中有1,在第0个位置,将1添加到第0个位置: 1、1、3、5、7、9例:数列: 1、3、5、7、9添加:4结果:数列中没有4,应该将 4 添加到数列第 4 个位置:1、3、4、5、7、9例:数列原创 2021-08-27 21:01:42 · 213 阅读 · 0 评论 -
双向链表也叫双链表
双向链表中任意一个节点,都可以通过通过它的前驱节点和后继节点,访问其他节点。每个节点都有两个指针,分别指向 直接前驱节点、直接后继节点。原创 2024-04-17 15:04:07 · 569 阅读 · 0 评论 -
数据结构:栈(Stack)
数据结构:栈栈是一种数据结构,是一种只能在一端进行添加和删除,受限制的线性表。先进入的元素被压入栈顶,最后进入的元素在栈顶,又称LIFO(后进先出)线性表。栈需要下面几种操作入栈 void Push(T element) 将元素添加到栈顶出栈 T Pop() 将返回栈顶元素并删除该元素栈顶元素 T Top() 返回栈顶元素但不删除判空 bool IsEmpty() 如果该栈中元素个数 大于0则返回 true,否则返回 false清空栈 void MakeEmpty() 将栈中所有元素删除下面原创 2021-06-29 17:46:00 · 608 阅读 · 0 评论 -
数据结构:堆(Heap)
数据结构:堆(Heap)堆就是用数组实现的二叉树(完全二叉树),它没有父指针、左右子指针。堆分为两种:大根堆(最大堆), 小根堆(最小堆),两者差别在于排序方式。小根堆:父节点的值比每一个子节点的值都小大根堆:父节点的值比每一个子节点的值都大堆中用来存储数据的结构为一个 数组,大/小根堆 的根节点即为数组的第 0 个元素,则第0个元素即为该堆中的 最大/小元素。小根堆的第0个元素为该堆中的最小值。大根堆的第0个元素为该堆中的最大值。如下小根堆:数组中的排序为0 1 3 5 9 8 4 6原创 2021-06-29 16:53:53 · 474 阅读 · 0 评论 -
前缀树-Trie树
前缀树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高原创 2023-09-26 16:14:04 · 338 阅读 · 0 评论 -
二叉树-数据结构
*树的层次:**从根节点开始,假设根节点是第一层,根节点的子节点为第二层,一次类推,如果某一个节点位于第L层,则其子节点位于第 L+1层。**树的深度:**也成树的高度,树中所有节点的层次最大值称为树的深度。**叶子节点:**也称为终端节点,没有子树的节点或者 度为零的节点。**分支节点:**也成非终端节点,有子树的节点或者 度不为零的节点。**节点的度:**一个节点拥有子树的数量称为节点的度。**节点的高度:**从节点到其子树叶子节点最长的路径。**节点的深度:**从根节点到节点的路径长度。原创 2024-04-12 21:09:34 · 399 阅读 · 0 评论 -
二叉树先序遍历
二叉树先序遍历一 先序遍历顺序为:跟节点->左子树->右子树先遍历跟节点,然后遍历左子树,最后遍历右子树,以此轮推,知道遍历完所有节点。 6 ------------- 4 8 -------- ------- 2 5 7 9原创 2021-06-29 11:33:53 · 3671 阅读 · 0 评论 -
二叉树中序遍历
二叉树中序遍历中序遍历顺序为:左子树->跟节点->右子树先遍历左子树,然后遍历跟节点,最后遍历右子树,以此轮推,直到遍历完所有节点。 6 ------------- 4 8 -------- ------- 2 5 7 9原创 2021-06-29 12:27:00 · 4765 阅读 · 0 评论 -
二叉树后序遍历
二叉树后序遍历后序遍历顺序为:左子树->右子树->跟节点边遍历左子树,然后遍历右子树,最后遍历跟节点,以此轮推,直到遍历所有节点 6 ------------- 4 8 -------- ------- 2 5 7 9原创 2021-06-29 14:38:19 · 2405 阅读 · 0 评论 -
二叉树层序遍历
二叉树层序遍历层序遍历顺序为:按照从上到下、从左到右的顺序,依次访问所有节点 6 ------------- 4 8 -------- ------- 2 5 7 9 -------- 1原创 2021-06-29 15:03:43 · 448 阅读 · 0 评论 -
二叉搜索树
第 (2.1) 种:Node 只有右子树,Node可以直接删除(直接使用Node右子树替换Node),跳转到第 3 步(Node,Node右子树)第 (2.2) 种:Node 只有左子树,Node可以直接删除(直接使用Node左子树替换Node),跳转到第 3 步(Node,Node左子树)如果 nextNode 是 Node 左子树最大的节点,则 nextNode 没有右子树了(因为右子树比它的值更大,右子树应该是最大的节点)第 (2.3.1) 获取 Node 左子树中最大的节点 也叫直接后继节点。原创 2024-04-15 17:12:18 · 754 阅读 · 0 评论 -
平衡二叉树(AVL)
2:平衡二叉树中所有节点的左右子树的高度差 小于等于1(称之为平衡因子)在非理想状态下,二叉搜索树的时间复杂度将会降低为 O(N),数组级别。二叉搜索树的 查询、插入、删除 时间复杂度都为 O(logN)LL 型:也称作左左型,在破坏节点的左边的左边插入而导致失衡。LR 型:也称 左右型,在破坏节点的左边的右边插入而导致失衡。RL 型:也称右左型,在破坏节点的右边的左边插入而导致失衡。RR 型:也称右右型,在破坏节点的右边的右边插入而导致失衡。假如我一组数据顺序为:1、2、3、4、5、6。原创 2024-04-15 21:01:17 · 404 阅读 · 0 评论 -
伸展树-搜索树
/ 因为根节点被删除了,搜索会将右子树中节点值最接近查找数值的节点返回,这个节点就是右子树中最小的节点,然后右子树中最小节点必伸展至根,且(因无类同节点)其左子树必空。// 根节点 = 其右子树,也就是原本的根节点已经被删除了。在这种情况中,X有一个父节点P和祖父节点G(P的父节点)。// 令 新的根节点左子树 = 上面存储的左子树。存在,此时有一个隐含信息,因为搜索到了该节点,那么这个节点此时已经被伸展到树根了。关于查询操作中,将节点伸展至根节点的操作,应用伸展(splaying)技术。原创 2024-04-16 16:04:15 · 878 阅读 · 0 评论 -
红黑树(Red Black Tree)
红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,但对之进行平衡的代价较低,其平均统计性能要强于 AVL。红黑树是继承自 二叉搜索树的,上面代码没有 查询函数的实现,因为红黑树的查询跟 二叉搜索树是一样的,所以直接继承子 二叉搜索树,相关代码请到我关于二叉搜索树的篇章寻找。红黑树的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它查找,插入和删除的时间复杂度为O(logN)原创 2024-04-16 17:05:02 · 354 阅读 · 0 评论 -
B树(B-tree)
如果 number > keyList[index], index++,如果 index >= childList.Count,查找失败,返回,否则继续循环执行 2 ,比较下一个 关键字 keyList[index]我在查询操作逻辑中隐含保留了一个 hot 节点,这个 hot 节点是最接近 number 的节点,如果查询成功,则 hot 不再起作用,如果查询失败,在 插入操作中 是有用处的。如果 number = keyList[index],则 在关键字中找到 了number,查询完成,返回节点。原创 2024-04-17 21:02:55 · 1115 阅读 · 0 评论 -
全排列 算法
全排列 算法全排列给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例 1:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2:输入:nums = [0,1]输出:[[0,1],[1,0]]示例 3:输入:nums = [1]输出:[[1]]using System;using System.Collections.Generic;cl原创 2021-08-03 12:22:45 · 257 阅读 · 0 评论 -
全排列 二 算法
全排列 二 算法给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。示例 1:输入:nums = [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]示例 2:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]class PermuteUniqueClass{ public PermuteUniqueClass() { //测试 int[]原创 2021-08-03 12:32:32 · 183 阅读 · 0 评论 -
N 皇后问题
B. 然后递归到下一行(M+1行),当我们递归到某行(S行)发现没有位置可以放置皇后了,我们就要回溯 执行如上 (5),返回到上一行(S-1 行)没有放置皇后的时候,然后在上一行(S-1 行)换一个可以放置皇后的位置,来放置皇后。A.使用递归函数来实现,按照每次递归一行棋牌来考虑,每一行 (M行) 只要有一个位置满足如上 (3) 条件,就可以放置皇后到该位置,我们记录放置皇后的位置,然后执行 如上 (4),(4).在一个位置放置一个皇后,记录皇后位置,并将其所在同一行、同一列、同一斜线上的格子数值 +1。原创 2023-09-26 22:35:35 · 513 阅读 · 0 评论 -
动态规划算法:背包问题
动态规划算法:背包问题原创 2022-09-20 17:26:32 · 508 阅读 · 0 评论