数据结构与算法(Java)
文章平均质量分 82
Java实现
董铠
这个作者很懒,什么都没留下…
展开
-
分治算法(汉诺塔)
package com.dk.dac;public class Hanoitower { public static void main(String[] args) { hanoiTower(3,'A','B','C'); } //汉诺塔移动方法(使用分治算法) public static void hanoiTower(int num,char a,char b,char c){ //如果只有一个盘 if (...原创 2020-07-03 17:37:12 · 201 阅读 · 0 评论 -
二分查找(非递归算法)
package com.dk.binarysearchnorecursion;public class BinarySearchNoRecursion { public static void main(String[] args) { //测试 int[] arr = {1,3,8,10,11,67,100}; int index = binarySearch(arr,1); System.out.println("index=原创 2020-07-03 17:32:04 · 390 阅读 · 0 评论 -
图
//创建图package graph;import java.util.ArrayList;import java.util.Arrays;public class Graph { //存储顶点String,使用ArrayList(2)保存矩阵int[][]edges private ArrayList<String> vertexList;//存储顶点集合 private int[][] edges;//存储图对应的邻接矩阵 private int numOfE...原创 2020-07-03 15:57:31 · 176 阅读 · 0 评论 -
多路查找树
原创 2020-06-29 07:45:18 · 89 阅读 · 0 评论 -
平衡二叉树
平衡二叉树是在二叉排序树的基础上实现的package avl;public class AVLTreeDemo { public static void main(String[] args) { int[] arr = {4,3,6,5,7,8}; //创建一个AVLTree对象 AVLTree avlTree = new AVLTree(); //添加结点 for (int i = 0; i < arr.length; i++) { avlTree原创 2020-06-29 07:40:26 · 79 阅读 · 0 评论 -
二叉排序树
package binarysorttree;public class BinarySortTreeDemo { //二叉排序树 public static void main(String[] args) { int[] arr = {7,3,10,12,5,1,9,2}; BinarySortTree binarySortTree = new BinarySortTree(); //循环添加结点到二叉排序树 for (int i = 0; i < arr.leng...原创 2020-06-29 07:33:52 · 80 阅读 · 0 评论 -
哈夫曼编码
赫夫曼编码是无损压缩,可以完整恢复赫夫曼树排序方法不同,则赫夫曼编码不同。package calculate;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream...原创 2020-06-28 16:45:39 · 356 阅读 · 0 评论 -
哈夫曼树
给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的**带权路径长度(wpl)**达到最小,这样的二叉树称为最优二叉树也称为哈夫曼树或霍夫曼树哈夫曼树是带权路径长度最短的树,权值较大的节点离根较近package calculate;import java.util.ArrayList;import java.util.Collections;import java.util.List;public class HuffmanTree { public static void mai原创 2020-06-28 16:18:12 · 164 阅读 · 0 评论 -
堆排序
package calculate;import java.util.Arrays;public class HeapSort { //堆排序 public static void main(String[] args) { //将数组升序排列(大顶堆) int[] arr = {4,6,8,5,9}; heapSort(arr); } //编写堆排序的方法 public static void heapSort(int[] arr) { int temp; .原创 2020-06-28 16:11:43 · 112 阅读 · 1 评论 -
二叉树
数组扩容分析:撤入删除效率低ArrayList底层存储(就是数组扩容)分析:链式存储分析:插入,删除效率较高。但检索时需要从头遍历,效率很低。树存储分析:树插入,删除,检索效率都很高。树示意图:二叉树概念:前序遍历:先输出父节点,再遍历左子树和右子树中序遍历:先遍历左子树,再输出父节点,最后遍历右子树后序遍历:先遍历左子树,再遍历右子树,最后输出父节点**小结:*...原创 2020-03-27 22:26:51 · 72 阅读 · 0 评论 -
哈希表
使用哈希表管理雇员信息:package calculate;import java.util.Scanner;public class HashTab { public static void main(String[] args) { //创建哈希表 HashTableDemo hashTableDemo = new HashTableDemo(7); //...原创 2020-03-23 17:00:37 · 141 阅读 · 0 评论 -
查找
线性查找package calculate;public class SeqSearch { //线性查找 public static void main(String[] args) { int[] arr = {-1,34,89}; System.out.println(seqSearch(arr, 34)); } public static int seqSearc...原创 2020-03-22 18:01:54 · 190 阅读 · 0 评论 -
排序
排序算法:内部排序:值将需要处理的数据加载到内存进行排序插入排序直接插入排序希尔排序选择排序简单选择排序堆排序交换排序冒泡排序快速排序归并排序基数排序(桶排序)外部排序:数据量过大,必须借助外存算法时间复杂度:时间频度:一个算法中的语句执行次数称为语句频度或时间频度T(n)时间复杂度:O(1) <O(logn)<O(n...原创 2020-03-20 17:45:58 · 79 阅读 · 0 评论 -
递归
递归调用机制原理图:迷宫问题:package dk.hello;public class MiGong { public static void main(String[] args) { // TODO Auto-generated method stub //先创建二维数组模拟迷宫 int[][] map = new int[8][7]; //用1表示墙,上下置...原创 2020-03-17 12:05:32 · 99 阅读 · 0 评论 -
前缀、中缀、后缀表达式
前缀表达式:波兰表达式(运算符位于数字之前)(3+4)×5-6的前缀表达式是 : -×+3456针对前缀表达式求值结果:从右至左扫描,将6、5、4、3压入堆栈遇到+运算符,弹出3和4(3为栈顶元素、4为次顶元素),计算3+4=7,将7压入堆栈接下来是×运算符,弹出7和5,计算7×5=35,将35入栈最后是-运算符,计算出35(次顶)-6(栈顶)的值为29中缀表达式:如(3+4)×...原创 2020-03-16 17:38:16 · 354 阅读 · 0 评论 -
栈
数组模拟栈:使用数组模拟栈定义变量top表示栈顶,初始化为-1入栈的操作,当有数据加入到栈,top++,stack[top] = data;出栈的操作,int value = stack[top] ,top–,return valueimport java.util.Scanner;class ArrayStackDemo { public static void main(S...原创 2020-03-16 11:07:51 · 98 阅读 · 0 评论 -
单向环形链表
约瑟夫问题:class Josephu { public static void main(String[] args) { //测试 System.out.println("测试"); CircleSingleLinkedList circle = new CircleSingleLinkedList(); circle.addBoy(5); circle.s...原创 2020-03-15 14:20:52 · 97 阅读 · 0 评论 -
双向链表
双向链表优点:单向链表只能一个方向查找,双向链表可以左右两个方向查找单向链表不能自我删除,需要辅助节点,双向链表可以自我删除class DoubleLinkedListDemo { public static void main(String[] args) { System.out.println("进行测试"); //进行测试 //先创建节点 HeroNod...原创 2020-03-15 14:17:38 · 97 阅读 · 0 评论 -
单向链表
单链表的添加(创建)思路:先创建一个head头节点,作用就是表示单链表的头后面每添加一个节点,就直接加入到链表的最后遍历:通过一个辅助变量,帮助遍历整个链表单向链表创建,直接添加到链表尾部,没有考虑排名:单向链表添加数据,考虑顺序:单链表修改数据:直接找到该节点,通过遍历temp.name = newheronode.name; temp.nickname = newhe...原创 2020-03-15 14:14:18 · 125 阅读 · 0 评论 -
链表
链表实际内存结构示意图:链表小结:链表是以节点的方式来存储每个节点包含data域,next域。指向下一个节点如图:链表的各个节点不一定是连续存储链表分为带头节点链表和没有带头节点的链表,根据实际需求来确定。链表逻辑结构示意图:...原创 2020-03-15 14:05:36 · 100 阅读 · 0 评论 -
数组模拟环形队列
思路分析:front变量含义做一个调整:front指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素,front的初始值=0rear变量的含义做一个调整:rear指向队列的最后一个元素的后一个位置。因为希望空出一个空间作为约定(队列最多存放数据量为maxSize - 1),rear的初始值=0当队列满时,条件是(rear + 1)% maxSize == front队...原创 2020-03-15 14:01:51 · 78 阅读 · 0 评论 -
数组模拟队列
队列是一个有序列表,可以用数组或者链表来实现,遵循先入先出原则。数组模拟队列:用maxSize表示队列的最大容量、用front和rear分别记录队列的前后端、front会随着数据输出而改变、rear会随着数据输入而改变。思路分析:rear是队列最后元素(含),front是队列最前元素(不含)当front == rear队列为空,输入数据时尾指针向后移rear+1若尾指针rear小于队列的...原创 2020-03-15 13:35:41 · 112 阅读 · 0 评论 -
稀疏数组
当一个数组大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组保存该数组。稀疏数组处理方法:记录数组有几行几列,多少个不同的值把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。二维数组转稀疏数组的思路:遍历原始的二维数组,得到有效数据的个数sum根据sum就可以创建稀疏数组sparseArr int 【sum+1】【3】将二维数组有效数据存入到稀...原创 2020-03-15 13:32:30 · 88 阅读 · 0 评论 -
线性结构和非线性结构
数据结构:线性结构:数组、队列、链表、栈。数据元素存在一对一的线性关系,有顺序存储结构(顺序表:存储元素地址是连续的)和链式存储结构(链表:存储元素不一定是连续的,元素节点存放数据元素和相邻元素的地址信息)**非线性结构:**二维数组、多维数组、广义表、树、图...原创 2020-03-15 13:28:41 · 243 阅读 · 0 评论