算法
dreamer_it
Nothing is impossible!
展开
-
二叉排序树(Java实现)
package cn.mrlij.binarysorttree;/** * 二叉排序树 */public class BinarySortTreeDemo { public static void main(String[] args) { BinarySortTree bst = new BinarySortTree(); int[] arr ...原创 2019-11-25 09:51:15 · 179 阅读 · 0 评论 -
数据压缩-赫夫曼编码字节数组
package cn.mrlij.tree.huffman;import java.util.*;import java.util.Map.Entry;/** * 实现生成哈夫曼树对应的哈夫曼编码 */public class HuffmanCode { public static void main(String[] args) { String str...原创 2019-11-14 09:32:44 · 226 阅读 · 1 评论 -
哈夫曼编码实现(Java实现)
package cn.mrlij.tree.huffman;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;/** * 实现...原创 2019-11-13 09:44:43 · 596 阅读 · 0 评论 -
数据压缩-创建哈夫曼树实现(Java实现)
package cn.mrlij.tree;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;public class Huff...原创 2019-11-12 21:54:42 · 144 阅读 · 0 评论 -
赫夫曼树的构建(Java实现)
package cn.mrlij.tree;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.List;/** * 赫夫曼树的创建 */public class HuffmanTree { public static void...原创 2019-11-11 10:03:21 · 104 阅读 · 0 评论 -
堆排序(Java实现)
package cn.mrlij.tree;import java.util.Arrays;public class HeapSort { public static void main(String[] args) { int arr[] = {4,6,8,5,9}; heapSort(arr); System.out.print...原创 2019-11-11 09:00:02 · 87 阅读 · 0 评论 -
线索化遍历二叉树(Java实现)
package cn.mrlij.tree.threadedbinarytree;public class ThreadedBinaryTree { public static void main(String[] args) { HeroNode root = new HeroNode(1,"tom"); HeroNode node2 = new...原创 2019-11-07 09:22:34 · 283 阅读 · 1 评论 -
线索化二叉树的实现(Java实现)
线索化二叉树的实现:将当前节点的前驱节点指向前一个节点,如果是第一个,则该前驱节点为空。将当前节点的后继节点指向为将要遍历的下一个节点。举例:按照中序遍历来说,该顺序应该为{8,3,10,1,14,6}。8号节点是第一个,将8号节点的前驱节点置为空,让他的左子树指向该前驱节点,右字数指向该后继节点3。这样可能存在重复的指向,因为8号,3已经指向了8号,现在8也指向3,所以,弄一个类型来区分...原创 2019-11-05 09:35:21 · 786 阅读 · 3 评论 -
顺序存储二叉树的代码实现(Java实现)
要求:给定一个有序数组,将该有序数组以树中前序遍历的方式打印输出。分析: 顺序二叉树通常只考虑完全二叉树 第n个左子节点为2*n+1 第n个右子节点为2*n+2 第n个元素的父节点为(n-1)/2 代码实现package cn.mrlij.tree;/** * 顺序存储二叉树的前序遍历 * 规律: * 顺序二叉树通常只考虑完...原创 2019-10-30 10:03:46 · 466 阅读 · 0 评论 -
二叉树的查找(Java实现)
本文实现二叉树的查找,有3种查找的方式,分别是前序,中序,后序遍历。package tree;/** * 二叉树的前中后序遍历 */public class BinaryTreeDemo { public static void main(String[] args) { BinaryTree bt = new BinaryTree(); H...原创 2019-10-29 10:02:32 · 1058 阅读 · 0 评论 -
二叉树的遍历(Java实现)
数组的优点在于查找快,根据索引就能直接查找到对应的值,但是要是进行增删改操作的话,必须复制原数组进行操作,所以就会出现效率问题。使用链表的优点在于增删改很快,但是查找的话,就必须从头开始遍历,也会影响效率。引入二叉树,增删改查的效率都很高。package tree;/** * 二叉树的前中后序遍历 */public class BinaryTreeDemo { ...原创 2019-10-28 10:18:49 · 114 阅读 · 0 评论 -
哈希表的实现(Java实现)
哈希表的结构是由数组+链表或者数组+二叉树组成,实现的思路是创建一个固定大小的链表数组,将各条链表交给数组来进行管理,根据自定义的规则,将数据依次插入链表中,这样查找起来会非常方便。package cn.mrlij.hash;import java.util.Scanner;public class HashTableDemo { public static void main(S...原创 2019-10-26 12:36:06 · 1724 阅读 · 0 评论 -
斐波那契查找算法(Java实现)
package cn.mrlij.search;import java.util.Arrays;public class FibonacciSearch { public static int maxSize = 20; public static void main(String[] args) { int arr[] = {2,3,6,8,9,20};...原创 2019-10-25 10:23:00 · 767 阅读 · 1 评论 -
插值查找(Java实现)
package cn.mrlij.search;import java.util.Arrays;/** * 插值计算:在二分查找的基础上,将原先的int mid = (left+right)/2 ==> * 改为int mid = left+(right-left)*((findVal-arr[left])/(arr[right]-arr[left])) * mid变为自适应...原创 2019-10-24 09:20:46 · 357 阅读 · 0 评论 -
二分查找(Java实现)
package cn.mrlij.search;/** * 二分查找:前提是一个有序序列。定义一个有序数组,将要查找的值与数组的中间值比较,如果比中间索引的值小, * 则向左递归,一直到查找到这个值为止。如果大于中间值,则向右递归。如果正好是中间的这个值的时候,就直接 * 返回该值的索引。 * 注意:1,如果查找的值不存在,就直接返回-1。 * 2,递归结束的条件:一是直...原创 2019-10-23 10:33:14 · 170 阅读 · 0 评论 -
线性查找(Java实现)
package cn.mrlij.search;/** * 线性查找:遍历数组,直接找出我们需要的查找的数据 */public class SeqSearch { public static void main(String[] args) { int arr[] = {2,5,24,6,78}; int index = seqSearch(ar...原创 2019-10-22 13:08:42 · 493 阅读 · 0 评论 -
基数排序(Java实现)
package cn.mrlij.sort;import java.lang.reflect.Array;import java.util.Arrays;/** * 基数排序 * 实现原理:首先定义10个桶,并给桶编号0-9,用于存放数组中待排序的数据。 * 1,第一轮的时候将分别计算出的数组中的各个数据的个位数,将个位数 * 对应的...原创 2019-10-22 10:40:28 · 449 阅读 · 0 评论 -
归并排序(Java实现)
package cn.mrlij.sort;import java.util.Arrays;public class MergeSort { public static void main(String[] args) { int arr[] = {4,6,75,35,267}; int temp[] = new int[arr.length];...原创 2019-10-21 15:04:43 · 116 阅读 · 0 评论 -
快速排序(Java实现)
实现原理:指定一个基数值,(正序)将大于该基数值的所有数放在基数值的右边,小于则放在该基数值的左边。一直往复这样,就能得到该数组的有序序列,使用的方法是递归实现代码:package cn.mrlij.sort;import java.util.Arrays;/** * 快速排序 * 原理:指定一个基数值,(正序)将大于该基数值的所有数放在基数值的右边,小于则放在该...原创 2019-10-14 16:14:04 · 115 阅读 · 0 评论 -
移动式希尔排序(Java实现)
上一篇介绍了交换式希尔排序,测试之后,发现速度非常慢,于是对希尔排序进行了改进,即移动希尔排序。实现代码package cn.mrlij.sort;import java.util.Arrays;/** * 交换式希尔排序 * 实现原理:将一个待排序的数组分成arr.length/2组,步长移动为arr.length/2,将一组内的数字比较的大小, * ...原创 2019-10-12 13:18:21 · 122 阅读 · 0 评论 -
交换式希尔排序(Java实现)
在之前的插入排序做了一下优化,当一个比较小的数比较靠后时,进行移动的次数必然要增多,所以使用希尔排序进行改进。实现原理:将一个待排序的数组分成arr.length/2组,步长移动为arr.length/2,将一组内的数字比较的大小,大的放在后面,小的放在前面。进行一轮排序之后,再继续将排序后的数组分为arr.length/2/2 组,步长为arr.length/2/2,从第一个数开始移动ar...原创 2019-10-10 11:25:28 · 182 阅读 · 0 评论 -
插入排序(Java实现)
实现原理:给定一个数组,将数组分为一个有序表和一个无序表。默认以第一个数为有序,将数组剩下的部分看做一个无序表,依次从无序表中选择数往有序表中插入,最终得到一个有序数组。需要注意的是,有的地方可能理解有点困难。定义待插入的数,待插入的索引值为该待插入数的索引值-1,就是说,每次插入的时候从他前面的一个数开始插入。两者进行比较,如果待插入的数小于他前一个数,那说明他要插入的位置不在此处。就将他前...原创 2019-10-09 22:17:50 · 79 阅读 · 0 评论 -
选择排序(Java实现)
思路分析选择排序的思路是,给一个待排序的数组,假定一个最小值。将该最小值与数组中剩下的值进行比较,如果大于数组中剩余的值就将它们两个的位置交换一下,一直循环这样下去,就能得到一个从小到大排序的一个数组。举个例子来说,给一个数组【6,2,5,1】,该数组是一个无序的,下面使用选择排序使它变成一个有序的数组。第一趟排序:首先定义6为最小的值,并记录它的索引值,为0.依次比较数组中剩...原创 2019-09-30 16:27:17 · 130 阅读 · 0 评论 -
冒牌排序及优化
通俗的讲,冒泡排序我的理解是,举个例子吧。..将未排序的数放在一个数组中,例如数组中的值是3,-1,10,4,9。要进行多趟排序,最终才能达到一个有序的数组。就是将数组的一个值与后面的一个值进行比较,如果前面的一个值比较大,则将较大的值一前面的一个值交换位置。如果前面的数小于或者等于后面的数,就不交换。一次往下进行,直到比较完数组中最后的一个值。一趟比较之后,会得到数组中最大的一个值。下一趟比...原创 2019-09-29 17:48:58 · 203 阅读 · 0 评论 -
Java利用数组实现队列(一)
对于队列,我的理解是一种用于存储数据的结构,它的特点是先进先出,就像去银行办理业务,先取号码,再排队,等到柜台叫你的时候你就去,办理完业务就离开,然后下一位继续。使用数组实现的原理是,首先初始化一个队列类,定义他的属性(队列的最大长度,队头位置,对尾位置,数组),初始化队头位置为-1,对尾位置为-1。不能定义为0是因为数组的索引值是从0开始的,定义为0则表示队列(数组)在开始就存在一个值,所以...原创 2019-08-20 07:49:49 · 916 阅读 · 0 评论 -
Java利用数组实现队列(二)——功能优化_循环数组
上一篇简单用数组实现了队列的功能,但是存在一点不足,就是数组不能达到复用的效果,所以这篇文章主要想说明下对数组实现队列的一个优化。分析:之前的数组,存在一个缺陷,就是当元素添加到数组满了之后,出队列却不能在继续添加了。所以,引入环形数组来解决这一问题front: 之前是指向队列元素的前一个位置,现在指向队列的第一个元素。即之前arr[front+1]表示队头位置,现在arr[front...原创 2019-08-20 10:43:49 · 206 阅读 · 1 评论 -
Java实现带头结点的单链表
链表的特点1,以节点方式存储,是链式结构。2,每个节点包含data域,next域:指向下一个节点。3,链表的各个节点不一定是连续存储。4,链表分为带头节点和不带头节点两种类型的链表。实现原理添加节点:如下图所示,首先遍历原有链表,找到最后一个节点,将要增加的节点添加到该节点的后面。下面介绍如何找到最后一个节点。思路是这样的,先遍历整个链表,定义一个辅助变量tem...原创 2019-08-21 09:43:50 · 1138 阅读 · 0 评论 -
面试题之逆序打印单链表(Java实现)
前提:在不改变原来单链表的结构的情况下,逆序打印单链表的内容。实现原理单链表中的一个节点保存的是数据和下一个节点的地址,现在要实现逆序打印单链表中的数据值,我们可以借助栈来实现逆序打印,将每一个节点压入栈中,利用栈先进后出的特点,最后一个进栈的节点将会最先出栈,正好符合我们所说的逆序打印。首先判断单链表是否存在有效节点,如果不存在则不能打印节点信息。再遍历单链表,将遍历出的每个节点放...原创 2019-09-18 16:21:23 · 632 阅读 · 0 评论 -
Java实现找零钱
题目:给定一个目标值和一个整形数组,在数组中存在两个的和与目标值相同,找出数组中两个值的位置前提:数组中只存在一种组合情况等于目标值实现思路 遍历数组,并将数组和它所在的值放入map中,用目标值减去数组中遍历的值,如果 在map中存在的话,说明该数组对应的下标和放入map中的值正好加起来是给定的目标值。实现代码package cn.mrlij.function;i...原创 2019-09-19 12:46:54 · 1466 阅读 · 0 评论 -
单链表之和(Java实现)
题目:数据在机器中存储的方式,比如342,在链表中是逆向存储的,所以就变成了2->4->3这样了,同样5->6->4就是465,给出两个用链表表示的数字,求两数字之和。要求以链表的方式返回,上面的例子就返回7->0->8实现原理:首先写出单链表的结构,定义一个函数,传入两个链表。当两个链表的其中一个链表为空时,则将链表里面存放的数据用0表示,当两个链表...原创 2019-09-19 15:17:19 · 233 阅读 · 0 评论 -
双链表的实现(Java实现)
双链表与单链表的区别是,单链表只能沿着一个方向去查找,双链表可以沿着正向和反向进行查找。如下图所示。单链表的实现可以看我前面的博客实现原理在原来单链表的属性中会添加一个pre(存放前一个节点的地址),原有属性不变。查找:和单链表的查找是完全一样的,只不过,通过反方向也可以进行查找修改:和单链表的修改是一样的。删除:删除有点特殊,单链表是将一个节点移除之后,将该节点...原创 2019-09-20 13:04:20 · 403 阅读 · 0 评论 -
环形单链表实现——约瑟夫问题
本文主要是借助环形链表解决约瑟夫环问题,约瑟夫问题是,设编号为1,2,...n的n个人围坐成一圈,约定编号为k(1<=k<=n) 的人从1开始报数,数到m的那个人就出列,依次类推,直到所有都出列为止,由此产生一个出队的序列。提示:用一个不带头结点的循环链表来处理该问题,先构成一个有n个节点的单循环链表,然后由k节点起从1开始计数,计到m是,对应节点从链表中删除,然后再从被删除...原创 2019-09-21 16:11:24 · 2626 阅读 · 0 评论 -
利用数组实现栈(Java实现)
栈介绍栈是一个先入后出的有序列表。栈是限制线性表中元素的插入和删除只能在线性表中同一端进行的一种特殊的线性表,允许插入和删除的一端,为变化的一端,称为栈顶,另一端为固定的一端,称为栈底。最先放入栈中的元素在栈底,最后放入的元素在栈顶。最先出栈的元素在栈顶,最后出栈的元素在栈底。分析使用数组来模拟栈的实现,首先考虑到数组的长度是固定的,所以使用栈就必须给一个特定的长度,...原创 2019-09-22 10:10:03 · 623 阅读 · 0 评论 -
利用栈使用简易计算器(Java实现)
题目:使用栈计算类似表达式:5+2*3-2 的计算结果提示:简易计算器操作符号限于+,-,*,/的计算分析思路:1,创建一个数栈和一个符号栈,数栈用于存放数字,符号栈用于存放符号2,创建一个索引index,用于遍历表达式3,扫描表达式,如果是数字直接进入数栈,如果是符号,则需要进行判断。分两种情况,一是当符号栈如果为空,直接将符号入栈。二是不为空,先比较当前栈顶的符号...原创 2019-09-23 13:05:58 · 869 阅读 · 2 评论 -
逆波兰计算器(Java实现)
之前的一篇博客中,讲的是用栈实现了中缀表达式的简易计算器,对于我们人来讲,中缀表达式是一种比较直观,而且非常好计算的一种形式,但对于计算器来讲,非常的难去看懂。所以,下面我讲下逆波兰计算器的Java实现。逆波兰式(后缀表达式)逆波兰表达式又叫做后缀表达式。逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasewicz)于1929年首先提出的一种表达式的表示方法 [1] 。后来,人...原创 2019-09-24 13:51:51 · 1177 阅读 · 3 评论 -
中缀表达式转后缀表达式
之前一篇文章讲了逆波兰式计算器的实现,我们一般使用的是前缀表达式,但是对于计算机来说,后缀表达式是一种更好的选择。下面讲下中缀表达式转换为后缀表达式。分析中缀表达式之前说过,就比如1+((2+3)*4)-5这样的计算表达式,但是如何转换成后缀表达式呢?1,定义两个栈s1和s2,运算符栈和用于存储中间结果的栈s22,从左往右扫描中缀表达式3,遇到操作数,将其压入s2。4,遇...原创 2019-09-25 10:33:50 · 155 阅读 · 1 评论 -
迷宫问题(Java实现)
如下是8*7的一个迷宫地图,现在要从左上角标红色数字0走到右下角数字0这个位置,实现自动查找路线。1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 0 1 1 ...原创 2019-09-26 15:40:58 · 2145 阅读 · 1 评论 -
八皇后问题(Java实现)
八皇后问题八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。分析代码实现package cn.mrlij.recursion;/** * 8皇后问题 */public class ...原创 2019-09-27 15:24:25 · 159 阅读 · 0 评论 -
Java实现简单的棋盘存档和读取功能
最近实现研究了下五子棋的存档,主要实现是将残局的五子棋棋盘保存到本地文件中,需要读取棋局时能够从本地文件获取,并展示出原有的残局局面。主要思路 如上图所示,第一个表格是11*11的棋局,可以转换成11行11列的二维数组,1代表黑子,2代表蓝子,转换成第二个表格所示的二维数组。在保存时,考虑到二维数组中0大部分是没有被占用的空间,所以我将二维数组转换成了一个n行3列的稀疏...原创 2019-08-19 11:15:30 · 4080 阅读 · 0 评论