![](https://img-blog.csdnimg.cn/20190612201800587.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
从零单刷数据结构(Java描述)
使用Java语言将大多数数据结构的底层实现展示出来。
waS_TransvolnoS
写过两行bug,尘世间一个迷途小码农。
展开
-
从零单刷数据结构(Java描述)(一)——数据结构概论
数据结构:相互之间存在一种或多种特定关系的数据元素的集合。通常分类是逻辑结构和物理结构。逻辑结构与物理结构:逻辑结构:数据对象中数据元素之间的相互关系。分类:1)集合结构:数据同属一个集合,彼此之间没有关系2)线性结构:数据是一对一的关系3)树形结构:数据是一对多的层级关系4)图形结构:数据是多对多的关系物理结构:数据的逻辑结构在计算机中的存储方式分类:1)顺序存储...原创 2019-04-28 11:24:45 · 144 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二)——算法概论
算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。算法的特性:输入输出:算法具有零个或多个输入,至少有一个或多个输出,即算法是一定需要输出的有穷性:算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受 的时间内完成确定性:算法的每一步骤都具有确定的含义,不会出现二义性可行性:算法的每...原创 2019-04-28 11:44:08 · 131 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(三)——数组
数组是一种典型的顺序存储结构,用一段地址连续的存储单元依次存储线性表的数据元素。扩展:自己动手实现可变数组import java.util.Arrays;public class MyArray { //用于存储数据的数组 private int[] elements; //构造方法 public MyArray() { elements= new int[0]; ...原创 2019-04-28 16:30:13 · 129 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(四)——查找
查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。(一)顺序表查找:从表的第一个记录开始依次往后,直到最后一个记录,查找到的话返回,否则返回-1。 // 线性查找,找到返回下标的索引值,否则返回-1 public static int arrSearch(int[] arr, int target) { int index = ...原创 2019-04-29 14:52:34 · 108 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(五)——栈
栈(Stack)是限定仅在表位进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称先进后出的线性表。//手动实现栈public class MyStack { //栈的抽象为顺序表(数组) int[]arr; //构造方法 public MyStack() { arr=new int[0];...原创 2019-04-29 15:48:19 · 133 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(六)——队列
队列:队列(Queue)是一种先进先出的、只允许在一端进行插入操作,而在另一端进行删除操作的线性表。允许插入的一段称为队尾,允许删除的一端称为队头。//自己动手实现队列public class MyQueue { //队列的抽象模型也是数组 int []arr; //构造方法 public MyQueue() { arr=new int[0]; } //入队,新建...原创 2019-04-29 19:35:43 · 93 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(七)——单链表
单链表:对每个数据元素,存在一个存储数据元素信息的域(数据域),一个存储直接后继位置的域(指针域)的存储映像称为结点(Node)。n个结点链接成一个链表,因为此链表的每个结点中只包含一个指针域,所以叫做单链表。//手动实现一个单链表public class Node { // 定义一个数据域 int data; // 定义一个指针域 Node next; // 构造方法 ...原创 2019-04-29 20:43:08 · 129 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(八)——单链表的删除与插入
单链表的删除实现原理是将前一个结点的指针绕过(要删除的)下个结点,指向下下个结点。//结点定义public class Node { // 定义一个数据域 int data; // 定义一个指针域 Node next; // 构造方法 public Node(int data) { this.data = data; } // 获取结点中的数据 public i...原创 2019-05-10 12:35:34 · 281 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(九)——循环链表
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为循环链表。//手动实现一个循环链表public class LoopNode { // 定义一个数据域 int data; // 定义一个指针域 LoopNode next = this; // 构造方法 public LoopNode(...原创 2019-06-06 17:20:26 · 104 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十)——双向链表
双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。即双向链表有两个指针域,一个指向直接后继,一个指向直接前驱。class DoubleNode{ //上一个结点 DoubleNode pre=this; //下一个结点 DoubleNode next=this; //结点数据 int data; public Do...原创 2019-06-06 20:05:57 · 89 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十一)——递归
一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数。每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。递归与迭代的区别是,递归用的是循环结构,迭代使用的是选择结构。递归能使程序的结构更清晰、更简洁,更容易让人理解,但是大量的递归调用回建立函数的副本,会耗费大量的时间和内存。迭代则不需要反复调用函数和占用额外的内存。//例:publi...原创 2019-06-07 16:00:57 · 97 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十二)——排序(交换排序)之冒泡排序
冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。import java.util.Arrays;class BubbleSort{ public static void main(String[] args) { int[]arr=new int[]{5,3,1,2,4}; ...原创 2019-06-07 17:01:27 · 91 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十三)——排序(交换排序)之快速排序
快速排序(Quick Sort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。//快速排序 //设置两个指针lo、hi指向最前、最后,分别向游标index=arr[i]靠近 public static void quickSort(int[]arr,int l...原创 2019-06-07 17:15:36 · 104 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十四)——排序(插入排序)之直接插入排序
直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。算法复杂度O(n^2),稳定的排序算法。//插入排序 public static void insertSort(int[]arr) { //遍历所有的数字 for(int i=1;i<arr.le...原创 2019-06-07 17:54:57 · 83 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十五)——排序(插入排序)之希尔排序
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。算法复杂度O(n^2),是不稳定的排序算法。直接插入排序,如果在基本有序的数组后来了一个较小的元素,则需要重复移动多次,希尔排序通过第一次length/2的移动改善了此问题。在这里插入代码片...原创 2019-06-08 17:07:56 · 97 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十六)——排序(选择排序)之简单选择排序
简单选择排序(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之。算法复杂度O(n^2),一种稳定的排序算法。//选择排序 public static void selectSort(int[]arr) { //遍历所有的数 for (...原创 2019-06-08 17:54:37 · 100 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十七)——排序之归并排序
归并排序(Merging Sort)原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后不断归并(两个序列互相比较,小的元素排前面,最后归并成一个有序的序列),不断递归,直到得到一个长度为n的有序序列。这种排序方法称为两路归并排序,是一种稳定的排序方法,复杂度O(nlogn); //归并排序 public static void mergeSort...原创 2019-06-11 21:50:23 · 106 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十八)——排序之基数排序(桶排序)
基数排序(radix sort),又称桶排序(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用。如先按个位排,再将元素按十位排,再将元素按百位排…直到达到最高位。基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。...原创 2019-06-12 20:57:52 · 112 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十九)——树
树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2…Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。树的基本概念:根节点:如图中的A结点。双亲结点:如D是G、H、I结点的双亲结点。子节点:...原创 2019-06-13 08:55:10 · 125 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二十)——二叉树
二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。二叉树的特点:1、任何一个结点的子结点数量不超过22、左、右子树有序不可颠倒特殊的二叉树:1、斜树所有的结点都只有左子树的二叉树叫左斜树。所有结点都是只有右子树的二叉树叫右斜树。这两者统称为斜树。...原创 2019-06-13 09:39:36 · 198 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二十一)——二叉树的创建
想创建一棵二叉树,首先要创建一棵带根结点的树,定义左右结点和结点的权。//定义一棵二叉树class BinaryTree{ TreeNode root; //设置根结点 public void setRoot(TreeNode root){ this.root=root; } //获取根结点 public Tree...原创 2019-06-14 09:20:26 · 181 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二十二)——二叉树的遍历
二叉树的遍历有前序遍历、中序遍历、后序遍历和层序遍历。前序遍历指先遍历根结点,然后遍历左结点直到叶子节点,再遍历右结点;中序遍历指先遍历遍历左结点直到叶子节点,然后遍历根结点,再遍历右结点;后序遍历指先遍历遍历左结点直到叶子节点,再遍历右结点到叶子结点,再遍历根结点;层序遍历指按树的层级遍历;//定义一棵二叉树public class BinaryTree { public Tr...原创 2019-06-14 11:07:02 · 136 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二十三)——二叉树的查找
二叉树的查找实际上是二叉树遍历的一个应用,通过遍历二叉树来寻找给定的值,本文以前序查找为例,其他查找方式类似。//定义一棵二叉树public class BinaryTree { public TreeNode root; // 设置根结点 public void setRoot(TreeNode root) { this.root = root; } // 获取根结点...原创 2019-06-14 11:31:34 · 113 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二十四)——二叉树结点的删除
二叉树结点的删除需要考虑如果要删除的不是叶子节点则需要递归删除整个子树。//定义一棵二叉树public class BinaryTree { public TreeNode root; // 设置根结点 public void setRoot(TreeNode root) { this.root = root; } // 获取根结点 public TreeNode ge...原创 2019-06-14 14:50:50 · 194 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二十五)——顺序存储的二叉树
顺序存储的二叉树即逻辑结构是二叉树,存储结构不同于前面的链式存储而是顺序存储的二叉树。顺序存储的二叉树为了保证存储连续,通常只考虑完全二叉树。逻辑结构:存储结构:顺序存储的二叉树的性质:1.第n个元素的左子结点的下标是2*n+1;比如:权为3的结点,其左子结点的下标是2*2+1=5;2.第n个元素的右子结点的下标是2*n+2;比如:权为3的结点,其右子结点的下标是2*2+2...原创 2019-06-15 10:29:56 · 130 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二十六)——排序之堆排序
堆排序(Heap Sort)是利用堆(本文使用大顶堆)进行排序的方法。它的基本思想是, 将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值) ,然后将剩余的 n-1 个序列重新构造成一个堆,这样就得到 n 个元素中的次小值。如此反复执行, 便能得到一个有序序列了。堆是具有下列性质的完全二叉树:每个结点...原创 2019-06-15 11:33:31 · 103 阅读 · 0 评论 -
用一道算法题入门动态规划——求最大不相邻数组子元素和
典型的动态规划问题,可以采用递归和非递归两种方式来做。问题:有一个数组,例如int[]arr=new int[]{4,1,1,9,7},求最大不相邻元素和。分析:这里有两种可能,选择最后一个元素或者不选择最后一个元素,如果选择arr[4]=7,那么结果为arr[4]+opt(2),其中opt(i)为前i个元素的最大和。如果不选择最后一个元素,则结果为opt(3),即{4,1,1,9}中的...原创 2019-08-31 11:57:38 · 428 阅读 · 0 评论 -
用一道算法题入门动态规划——nSum问题
给定一个数组 int[]arr=new int[]{3,34,4,12,5,2}和一个数字s=9,求数组中是否存在n个数字的和为sclass nSum{ public static void main(String[] args) { int[]arr=new int[]{3,34,4,12,5,2}; //递归结果 boolean ...原创 2019-08-31 15:37:34 · 358 阅读 · 0 评论 -
算法:求最多有k个不同字符的最长子字符串的长度
问题给定一个字符串,找到最多有k个不同字符的最长子字符串,并返回其长度。样例例如,给定 s = “eceba” , k = 3,T 是 “eceb”,长度为 4.第一种思路将母问题分为两个子问题:1.如果从从头开始找,求最长k不同子串长度2.如果从第二个字符开始找,求最长k不同子串长度然后不断循环递归实现public static int longestSubstringDi...转载 2019-09-09 21:30:00 · 598 阅读 · 0 评论