数据结构和算法
文章平均质量分 72
从0开始,将学习到的有关数据结构和算法的知识整理出来
CrAcKeR-1
伸手摘星,即使徒劳无功,亦不至满手污泥。
展开
-
Java实现--归并排序(递归)
《Java数据结构和算法》如此描述分治算法:把一个大问题分成两个相对来说更小的问题,并且分别解决每一个小问题,对每一个小问题的解决方案是一样的:把每个小问题分成两个更小的问题,并且解决它们。这个过程一直持续小去知道达到易于求解的基值情况,就不用再继续分了。时间复杂度:O(N*log2N)首先我们是先归并两个有序数组,归并流程如下:代码如下:/** * 归并算法...原创 2018-10-11 11:43:44 · 1383 阅读 · 0 评论 -
笑谈模拟递归
摘自《Java数据结构和算法》: 递归和栈之间有一种紧密的联系。事实上,大部分的编译器都是使用栈来实现递归的。正如我们曾提到过的,当调用一个方法的时候,编译器会把这个方法的所有参数及其返回地址(这个方法返回时到达的地方)都压入栈中,然后把控制转移给这个方法。当这个方法返回的时候,这些值退栈。参数消失了,并且控制权重新回到返回地址处。大家应该都知道高斯的故事,说是有一天他的...原创 2018-10-12 12:48:52 · 551 阅读 · 0 评论 -
递归实现乘方,最简单类型背包问题,组合
目录 乘方问题 背包问题 组合 乘方问题 import java.util.Scanner;/** * 递归实现乘方问题 * @author Administrator * */public class Pow{ @SuppressWarnings("resource") public static void main(String[] args)...原创 2018-10-15 16:45:33 · 624 阅读 · 0 评论 -
递归实现Josephus问题
Josephus问题是古代一个著名的数学难题。围绕这个问题有很多故事。 其种一个说Josephus是一群被罗马人抓获的犹太人中的一个,为了不被奴役,他们选择了自杀。 他们排成一个圆圈,从某个人开始,沿着圆圈计数。每报第n个数的人就要离开圆圈去自杀。但是Josephus不想死,他想活下来,所以他制定了规则,以使他称为最后一个离开圆圈的人(最后一个离开表示其他人都出圈去自杀了,他就活下来了)。 如果...原创 2018-10-06 17:55:58 · 927 阅读 · 1 评论 -
递归实现排列
先给大家讲一个故事:这是一个风云变幻的时代,几个字母争先恐后的抢着做老大,但是姜还是老的辣,经过一番折腾,最后的最后,几个字母还是回到最初的样子,坐回他们原来的位置,一起干回他们原来的事情——(构成一个完整的"单词"),老大还是那个老大...(啊...真是一个有趣的故事...手动滑稽) 为了让大家更好的理解,我将4个字母构成的单词(不一定是真正的单词,只要由四个字母构成,我们在...原创 2018-10-08 17:55:55 · 761 阅读 · 0 评论 -
Java实现--链表栈
用链表实现栈:其实就只是换了个名字,包装起来而已,没什么新的东西。注:这里插入结点的方法应为在头部插入结点(与输入的值逆置),这样构成的才是栈关于定义链表可以查看我的另一篇博文https://blog.csdn.net/szlg510027010/article/details/82862965/** * 用链表实现栈 * @author Administrator *...原创 2018-09-27 18:18:34 · 384 阅读 · 0 评论 -
Java实现--链表队列
用链表实现队列的操作,其实质就是把双端队列包装一下,包装成队列而已,其实质用到的是双端队列的两个方法,第一个方法是insertLast(int data),这是队列的插入操作,另外一个remove()操作,用到的是deleteFirst()方法,将这两个方法包装一下就成了队列。以下为完整地代码:/** * 定义一个结点类 * @author Administrator * */...原创 2018-09-27 22:31:16 · 204 阅读 · 0 评论 -
Java实现--有序链表
《Java数据结构和算法》有感而出,最好自己先尝试实现一遍。 代码中有详细的注释:/** * 定义一个结点类 * @author Administrator * */public class Link { public int data; //数据域 public Link next; //指向下一个结点 public Link(int data) { super...原创 2018-09-28 23:36:25 · 3046 阅读 · 1 评论 -
Java实现--双向链表
为什么要构造双向链表呢?有什么用呢?《Java数据结构和算法》一书给出了一个例子回答了这两个问题:“假设一个文本编辑器用链表来存储文本。屏幕上的每一行文字作为一个String对象存储在链结点中。当编辑器用户乡下移动光标时,程序移到下一个链结点操纵或显示新的一行。但是如果用户向上移动光标会发生什么呢?在普通的链表中,需要current变量(或起同等作用的其它变量)调回到表头,再一步一步地向后走到...原创 2018-09-29 12:14:17 · 6724 阅读 · 6 评论 -
Java实现--链表迭代器
其实刚刚接触链表迭代器的时候并不知道这个有什么用,直到今天把链表迭代器的代码敲了两三遍,将里面的内容理解透彻了以后,才发现原来链表迭代器真的有很大用处,效率高是迭代器的一大优势。当我们需要在特定结点前面插入或者删除甚至修改该结点的值即data域的时候就会显得相当有用,若没有迭代器,只是一个普通的链表,当我们需要获取特定结点的,比如说第一个第二个或者第三个,我们又要从头开始遍历链表,并且还要引入一...原创 2018-10-05 18:53:57 · 1386 阅读 · 0 评论 -
Java实现--单链表
在链表的环境中,很容易堆“引用”产生混淆。在Link的类定义中定义以个Link类型的域,这看起来很奇怪。编译器怎样才能不混淆呢?编译器在不知道一个Link对象占多大空间的情况下,如何能知道一个包含了相同对象的Link对象占用多大空间呢?其实,Link对象并没有真正包含另外一个Link对象,学过C语言或者C++的同学知道,其实这就类似于指针,该引用只是一个堆某个对象的参照数值,...原创 2018-09-27 10:07:49 · 197 阅读 · 0 评论 -
Java实现--双端链表
其实跟C语言创建单链表,尾部插入结点操作的是一样的,本质上是一样的双端链表与传统的链表非常相似,但是他有一个新增的特性:即对最后一个链结点的引用,就像对第一个链结点的引用一样。对最后一个链结点的引用允许像在表头一样,在表尾直接插入一个链结点。 当然,仍然可以在普通的单链表表尾插入一个链结点,方法是遍历整个链表知道到达表尾,但是这种方法效率很低。像访问表头一样访问表尾的特性,使双端链表更适合于...原创 2018-09-27 17:16:42 · 457 阅读 · 0 评论 -
循环链表
对于单链表而言,最后一个结点指针域是空指针,如果将该链表头指针置入该指针域,则使得链表头尾结点相连,这就构成了单循环链表。和单链表的操作基本相同,只是把最后一个结点的指针域指向头指针而已,其他没有变化。上篇博文我们说单链表有个缺点,就是无法随机查找,每次查找一个结点都要从头开始,那么单循环链表就很好地解决掉了这个问题。单循环链表可以从表中任意结点开始遍历整个链表。循环链表示意图:...原创 2018-09-26 12:34:55 · 1468 阅读 · 0 评论 -
单链表(完整 含main方法)
链表:通过一组任意的存储单元来存储线性表中的数据元素,由一个个结点构成。链表之所以让初学者难以理解,是因为要回溯到上一个结点,并利用这个结点,很多人的思维一直都是往下面追溯,所以才会觉得难以理解,多动手画画图会容易理解许多。链表示意图:结点:结点类型如下:typedef struct lnode{datatype data; //数据域struct ...原创 2018-09-25 18:28:53 · 22271 阅读 · 16 评论 -
(详细注释)Java实现--表达式之中缀转后缀并计算
自打遇到栈,一直都想些写一篇通俗易懂的将中缀表达式转化为后缀表达式的博文,今天总算完成了这个心愿。 所有的解释在代码行里面均有解释。有什么不懂的可以在评论区或者私信我。 为了不用一直拉动代码行看注释(这回很麻烦也很浪费时间),本人将较长的注释分成了两行。写在前面: 后缀表达式:波兰逆序数,将中缀表达式转换成后缀表达式不用做算数运算,它不求中缀表达式的值...原创 2018-09-20 16:24:50 · 1112 阅读 · 1 评论 -
Java实现--优先级队列
《Java数据结构和算法》-->像栈和队列一样,优先级队列也经常用作程序员的编程工具。 很多情况下需要访问具有最小关键字的项或者是最大关键字的项,,具有最高或最小的关键字具有最高的优先级。我们就可以采用优先级队列。这里使用的是简单的数组来实现优先级队列,这种实现方法插入比较慢,但是它比较简单,适用于数据量比较小的并且不是特别在意插入速度的情况。有一种比数组要快的,就是使用堆来建立优先级...原创 2018-09-18 20:07:11 · 983 阅读 · 0 评论 -
Java实现--栈
今天初步学习了栈,在《Java数据结构和算法》中如此描述到:我们将栈和队列作为程序员的工具来运用,主要作为构思算法的辅助工具,而不是完全的存储工具,栈和队列的访问时受限制的,即在特定的时刻只有一个数据项可以被读取或删除[这是理论上的不允许多个访问,除非作弊]栈:存储数据的时候采用的方法是“后进先出法”(普及一下:这在财务报表中存货计量中也有)当我存储一个数据的时候,我们都是在最顶层插入的。...原创 2018-09-13 22:57:31 · 261 阅读 · 0 评论 -
Java实现--队列
昨天风王“山竹”肆虐大片土地...今天还在不断下雨进入正题吧。今天学习的是队列,跟栈(LIFO)不同,队列采用的是先进先出(FIFO)的模式,个人认为,其实队列跟栈都是比较简单的,我们定义了两个指针变量,一个是队首(front),另外一个就是队尾(rear),为了更统一的理解,我们把队列里面的一个个元素(在这里是数字),当做现实世界中一个个的人。讲最重要的两个操作,insert操作和remov...原创 2018-09-17 17:40:41 · 1558 阅读 · 0 评论 -
Java实现--奇偶排序
《Java数据结构和算法》中写道:奇偶排序实际上在多处理器环境中很有用,处理器可以分别同时处理每一个奇数对,然后又同时处理偶数对。因为奇数对是彼此独立的,每一刻都可以用不同的处理器比较和交换。这样可以非常快速地排序。 撅个栗子:.............................................这样一直按偶数排序一次,奇数排序一次,直到.........原创 2018-09-12 22:59:18 · 1238 阅读 · 0 评论 -
Java实现--冒泡排序(优化)
public class BubbleSort { public static void main(String[] args) { int[] a = {0,55,44,33,22,11}; int n=5; int k;//用于交换 int b; int all = n;//(由于下面要对n进行操作,这里需要方便输出) for(i...原创 2018-09-10 17:20:13 · 496 阅读 · 0 评论 -
Java实现--选择排序
public class SelectSort { public static void main(String[] args) { int[] a = {9,8,7,6,5,4,3,2,1,0}; int n=10; int change; for(int num:a) System.out.print(num+" "); System.out.prin...原创 2018-09-10 18:33:12 · 99 阅读 · 0 评论 -
Java实现--插入排序
尽量写得通俗易懂些~ 今早学习的内容有插入排序,之前看到插入排序没认真去分析,今日一看,还挺有意思的,联想到了实际生活上面就会感到很意思。插入排序是有个前提的,就是我们每次要插入一个数的时候,都必须在一个有序数列进行。写到这里,从来没有看过插入排序的童鞋可能会产生这样的一个疑问:都有序序列了,还排它个大头鬼哦。且慢,让我们看看下面这个例子。 小伙伴们长这么大应该都...原创 2018-09-11 23:55:39 · 122 阅读 · 0 评论 -
Java实现--对象排序
将我们之前所学的插入排序应用到实际生活中去,完成一个对象的排序,这里定义一个Person类,按姓名的字母来排列。首先我们自定义一个Person类:/** * 定义一个Person类 * @author Administrator * */public class Person { private int age; private String name; public...原创 2018-09-12 22:15:10 · 581 阅读 · 0 评论