![](https://img-blog.csdnimg.cn/20210717180447567.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 73
数据结构相关
zsxfa
这个作者很懒,什么都没留下…
展开
-
堆排序中 i 位置的节点的子节点位置为 2i+1, 2i+2, 父节点为 (i-1) / 2
在堆排序中使用到了左右子节点,它们的节点位置是 2i + 1 和 2i + 2,下面是如何得到这个结论:1.我们首先假设一个节点:它的数组下标是 i ,在二叉树的第 n 层的第 x + 1 个我们可以知道完全二叉树的前 n 层的总结点数是 2 * n - 1 个,在第n层的节点,前n-1层有 2^(n-1) - 1 个节点,加上他本层前面的x个节点,则: i = 2^(n-1) - 1 + x2.我们再来看子节点,i 的子节点在第 n + 1 层,对于左子节点,令他在数组中下标为j。左子节点在原创 2021-02-07 23:22:58 · 2091 阅读 · 2 评论 -
查找算法(3种)
查找算法二分查找算法(有序数组)插值查找算法(有序数组)斐波那契(黄金分割法)查找算法二分查找算法(有序数组)思路分析:1.首先需要确定该数组的中间下标mid = (left + right) / 22.让需要查找的数 findVal 和 arr[mid] 比较findVal > arr[mid] 说明要查找的数在 mid 的右边,因此需要向右递归查找findVal < arr[mid] 说明要查找的数在 mid 的左边,因此需要向左递归查找findVal = a原创 2021-01-12 20:01:24 · 205 阅读 · 0 评论 -
常见的排序算法实现
排序算法排序的分类冒泡排序排序的分类冒泡排序冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。优化:因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志 flag 判断元素是否进行过交换。从而减少不必要的比较。// 将冒泡排序算法封装成一个方法 public sta原创 2021-01-10 21:05:45 · 562 阅读 · 2 评论 -
递归-八皇后(回溯算法)
问题介绍八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法(92)。算法思路分析第一个皇后先放第一行第一列第二个皇后放在第二行第一列、然后判断是否 OK, 如果不 OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适继续第三个皇后,还是第一列、第二列……直到第 8 个皇后也能放在一个不冲突的位置,原创 2021-01-01 15:56:38 · 166 阅读 · 0 评论 -
循环节长度
两个整数做除法,有时会产生循环小数,其循环部分称为:循环节。比如,11/13=6=>0.846153846153… 其循环节为[846153] 共有6位。下面的方法,可以求出循环节的长度。请仔细阅读代码,并填写划线部分缺少的代码。public static int f(int n, int m) { n = n % m; Vector v = new Vector(); for(;;) { v.add(n); n *= 10; n = n % m;原创 2020-12-29 20:12:44 · 1368 阅读 · 0 评论 -
问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入格式输入包含一个整数n。输出格式输出一行,包含一个整数,表示Fn除以10007的余数。说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。样例输入 : 10 样例输出 : 55样例输入 : 22 样例输出 : 7704数据规模与约定1 <= n <= 1,000,000。import java.util.*原创 2020-12-28 11:31:20 · 523 阅读 · 0 评论 -
双向链表中按顺序添加数据
代码如下public void addByOrder(HeroNode2 heroNode) { HeroNode2 temp = head; boolean flag = false; while (true) { if (temp.next == null) { break; } if (temp.next.no > heroNode.no) { break; } else if (temp.next.no == heroNode.no)原创 2020-10-26 16:24:21 · 658 阅读 · 1 评论 -
合并两个有序的单链表,合并之后依然有序
代码实现public static HeroNode unitePrint(HeroNode head1, HeroNode head2){ if(head1.next == null){ return head2.next; } if(head2.next == null){ return head1.next; } HeroNode newList = new HeroNode(0,"",""); HeroNode head = newList;//新链表原创 2020-10-26 16:15:08 · 387 阅读 · 0 评论 -
单链表的反转
代码实现:public static void reversetList(HeroNode head) { // 如果当前链表为空,或者只有一个节点,无需反转,直接返回 if (head.next == null || head.next.next == null) { return; } // 定义一个辅助的指针(变量),帮助我们遍历原来的链表 HeroNode cur = head.next; HeroNode next = null;// 指向当前节点的下一个节点原创 2020-10-26 16:09:26 · 67 阅读 · 0 评论 -
查找单链表中的倒数第 k 个结点
思路:1. 编写一个方法,接收head节点,同时接收一个index2. index表示是倒数第index个节点3. 先把链表从头到尾遍历,得到链表的总长度getLength4. 得到size后,我们从链表的第一个开始遍历(size-index个)5. 如果找到了返回该节点,否则返回null public static HeroNode findLastIndexNode(HeroNode head, int index) { if (head.next == null) { retu原创 2020-10-26 16:00:27 · 560 阅读 · 0 评论 -
环形队列
队列介绍1) 队列是一个有序列表,可以用数组或是链表来实现。2) 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出3) 示意图 如下数组模拟队列队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear 则是随着数据输入而改变.front与rea原创 2020-10-17 22:35:29 · 74 阅读 · 0 评论 -
稀疏数组
先看一个实际需求:因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据.->稀疏数组。稀疏数组的处理方法是:记录数组一共有几行几列,有多少个不同的值把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模本例实现将二维数组转化成稀疏数组并保存到文件,再进行读取代码实现package com.jachin.sparsearray;import java.io.BufferedReader;import java.io.File;import原创 2020-10-17 21:57:33 · 113 阅读 · 0 评论 -
汉诺塔问题
什么是汉诺塔汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。有三个金刚石塔,第一个从小到大摞着64片黄金圆盘。现在把圆盘按大小顺序重新摆放在最后一个塔上。并且规定,在小圆盘上不能放大圆盘,在三个塔之间一次只能移动一个圆盘。也就是说需要将A上的圆盘全部移动到C上,并且要保证小圆盘始终在大圆盘上。实现方式首先,我们可以先列出前几种结果1.当圆盘个数为1时第1个圆盘直接从A—>C2.当圆盘的个数为2时第1个圆盘从 A—>B第2个圆盘从 A—>C第1个圆盘从原创 2020-07-17 22:20:36 · 5276 阅读 · 0 评论 -
判断回文数的解法
判断回文数的解法解法操作是将后半段的数字进行翻转,当数的长度是偶数时,它对折过来应该是相等的;当数的长度是奇数时,那么它对折过来后,有一个的长度需要去掉一位数(除以 10 并取整)。1.进行取余操作取出最后一位的值2.将每次的最低位放在取出数的末尾3.每次取值,num都需要/104.当num小于sum说明已过半5.最后判断如果数的长度是偶数的话,num 和 sum 相等;如果是奇数的话,最中间的数字就在sum 的最低位上,将它除以 10 以后应该和 num 相等。public static b原创 2020-07-14 13:45:56 · 151 阅读 · 0 评论