Java数据结构与算法
用Java实现数据结构和算法
GTboy100
这个作者很懒,什么都没留下…
展开
-
Java数据结构与算法———(60)动态规划
给出一个数字数组,取出若干个数字,使得这些数字的和最大,要求取出的数字两两之间不能相邻。一、代码package dynamicprogramming;/** * 给出一个数字数组,取出若干个数字,使得这些数字的和最大,要求取出的数字两两之间不能相邻 * 思路:动态规划 * 1. 动态规划的核心是“选和不选”的问题,对数组中每一个元素,都有“选或不选”的问题 * 2. 新建一个数组 opt,用来存放最优解。opt[i] 表示“选或不选” arr[i] 的最优解,当数组有 n 个元素时,肯定是要对原创 2020-07-28 12:38:13 · 148 阅读 · 0 评论 -
Java数据结构与算法———(59)堆排序
写一个堆排序一、代码package tree;import java.util.Arrays;/** * 堆排序 * 1. 将待排序序列构造成一个大顶堆(从左向右,从下往上)。此时,整个序列的最大值就是堆顶的根节点。 * 2. 将其与末尾元素进行交换,此时末尾就为最大值。 * 3. 然后将剩余n-1个元素重新构造成一个堆(从左向右,从下往上),这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。 * @author Lee * */public class HeapS原创 2020-07-26 14:31:36 · 132 阅读 · 0 评论 -
Java数据结构与算法———(58)顺序存储二叉树的前序、中序、后序遍历
完成顺序存储二叉树的前序、中序、后续遍历。一、代码public class ArrayBinaryTreeDemo { public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5, 6, 7 }; ArrayBinaryTree arrayBinaryTree = new ArrayBinaryTree(arr); System.out.println("前序遍历"); arrayBinaryTree.p原创 2020-07-24 11:14:09 · 215 阅读 · 0 评论 -
Java数据结构与算法———(57)创建一个二叉树,删除其中的结点
先创建一个二叉树,并添加结点,然后根据结点id删除对应的结点。一、代码import java.util.Scanner;public class BinaryTreeDemo { public static void main(String[] args) { //先创建一颗二叉树 BinaryTree binaryTree = new BinaryTree(); //创建需要的结点 HeroNode root = new HeroNode(1, "宋江");//二叉树的根节点原创 2020-07-24 01:51:26 · 217 阅读 · 0 评论 -
Java数据结构与算法———(56)创建一个二叉树,并实现前序、中序、后续输出和查找
创建一个二叉树,并实现前序、中序、后续遍历输出和查找。一、代码import java.util.Scanner;public class BinaryTreeDemo { public static void main(String[] args) { //先创建一颗二叉树 BinaryTree binaryTree = new BinaryTree(); //创建需要的结点 HeroNode root = new HeroNode(1, "宋江");//二叉树的根节点 H原创 2020-07-23 22:05:16 · 163 阅读 · 0 评论 -
Java数据结构与算法———(55)创建一个哈希表
有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址…),当输入该员工的id时,要求查找到该员工的 所有信息。要求: 不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)。一、代码import java.util.Scanner;public class HashTableDemo { public static void main(String[] args) { // 1. 创建一个哈希表 HashTab hashTab = new Ha原创 2020-07-23 13:32:10 · 1134 阅读 · 0 评论 -
Java数据结构与算法———(54)斐波那契查找法
斐波那契查找法,也成为黄金分割查找法,也是基于二分查找法改进而成,主要也是改进了mid的求解公式/一、代码import java.util.Arrays;/** * 斐波那契查找也是二分查找的改进版,也是改进了 mid 的求解公式 * @author Lee * */public class FibonacciSearch { public static int maxSize = 20;//斐波那契数列的大小 public static void main(String[] arg原创 2020-07-22 21:12:35 · 113 阅读 · 0 评论 -
Java数据结构与算法———(53)插值查找(单个)
插值查找是改进版的二分查找。一、代码package search;import java.util.Arrays;/** * 插值查找算法,是一种改进的二分查找法,改进的地方主要是mid * 二分查找:mid = (left + right) / 2 = left + (right - left) / 2 * 插值查找:mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]) * @au原创 2020-07-22 16:59:52 · 108 阅读 · 0 评论 -
Java数据结构与算法———(52)二分查找(多个)
在一个有序数组中{1, 8, 10, 89, 1000, 1000, 1000, 1234}有多个相同的数值,用二分查找法将所有的数值都查找到,比如查找1000。一、代码import java.util.ArrayList;/** * 二分查找,要求数组必须有序 二分查找,用递归实现 * * @author Lee * */public class BinarySearch { public static void main(String[] args) { int[] arr原创 2020-07-22 16:18:25 · 274 阅读 · 0 评论 -
Java数据结构与算法———(51)线性(顺序)查找(多个)
线性(顺序)查找是逐一比对去查找,所以既可以处理有序的数组,也可以处理无序的数组。本方法实现了当一个有序数组中有多个相同的值时,返回其全部下标。一、代码import java.util.ArrayList;/** * 顺序(线性)查找即可以处理有序的数组,也可以处理无序的数组 * @author Lee * */public class SequenceSearch { public static void main(String[] args) { int[] arr = {11原创 2020-07-22 16:14:12 · 196 阅读 · 0 评论 -
Java数据结构与算法———(50)二分查找(单个)
二分查找只能处理有序的数组,在数组中找到一个等于待查找值就返回其下标。一、代码/** * 二分查找,要求数组必须有序 二分查找,用递归实现 * * @author Lee * */public class BinarySearch { public static void main(String[] args) { int[] arr = { 1, 8, 10, 89, 1000, 1234 }; int resIndex = binarySearch(arr, 0, arr.原创 2020-07-22 15:09:12 · 125 阅读 · 0 评论 -
Java数据结构与算法———(49)线性(顺序)查找(单个)
线性(顺序)查找是逐一比对去查找,所以既可以处理有序的数组,也可以处理无序的数组。只要在数组中找到一个等于带查找的值就返回其下标。一、代码package search;/** * 顺序(线性)查找即可以处理有序的数组,也可以处理无序的数组 * @author Lee * */public class SequenceSearch { public static void main(String[] args) { int[] arr = {1, 9, 11, -1, 34, 89};原创 2020-07-22 14:22:43 · 112 阅读 · 0 评论 -
Java数据结构与算法———(48)测试基数排序花费的时间
归并排序的效率比较高,对于8万个数据,处理的时间小于1秒;对于8十万个数据,处理的时间小于1秒;对于8百万个数据,处理的时间1秒;对于8千万个数据,处理的时间12秒。一、代码import java.text.SimpleDateFormat;import java.util.Date;public class RadixSort { public static void main(String[] args) { // 测试80000个数据 int[] arr = new int[原创 2020-07-22 13:59:12 · 185 阅读 · 0 评论 -
Java数据结构与算法———(47)基数排序简洁版
基数排序简洁版。一、代码/** * 当排序的序列中有负数时,不建议使用基数排序 */import java.util.Arrays;public class RadixSort { public static void main(String[] args) { int[] arr = { 53, 3, 542, 748, 14, 214 }; System.out.println("基数排序前:" + Arrays.toString(arr)); radixSort(arr)原创 2020-07-22 13:12:18 · 113 阅读 · 0 评论 -
Java数据结构与算法———(46)基数排序详解
详解基数排序。一、代码import java.util.Arrays;public class RadixSort { public static void main(String[] args) { int[] arr = { 53, 3, 542, 748, 14, 214 }; radixSort(arr); } // 基数排序的方法 public static void radixSort(int[] arr) { // 定义一个二维数组,表示10个桶,每个桶就是一原创 2020-07-22 11:06:55 · 109 阅读 · 0 评论 -
Java数据结构与算法———(45)测试归并排序花费的时间
归并排序的效率比较高,对于8万个数据,处理的时间小于1秒;对于8百万个数据,处理的时间一、代码package sort;import java.text.SimpleDateFormat;import java.util.Date;public class MergeSort { public static void main(String[] args) { //测试80000个数据 int[] arr = new int[80000]; int[] temp = new i原创 2020-07-22 00:35:51 · 326 阅读 · 0 评论 -
Java数据结构与算法———(44)归并排序
归并排序,相对来说比较难理解。一、代码package sort;import java.util.Arrays;public class MergeSort { public static void main(String[] args) { int[] arr = { 8, 4, 5, 7, 1, 3, 6, 2 }; int[] temp = new int[arr.length];// 归并排序需要一个额外的空间 System.out.println("归并排序前:" +原创 2020-07-21 23:31:40 · 113 阅读 · 0 评论 -
Java数据结构与算法———(43)测试快速排序花费的时间
测试快速排序所花费的时间,通过测试发现,快速排序的速度相当快,处理8000000个数据也只需要1秒。一、代码package sort;import java.text.SimpleDateFormat;import java.util.Date;public class QuickSort { public static void main(String[] args) { //用8000000个数据测试快速排序 int[] arr = new int[8000000];原创 2020-07-21 21:34:12 · 332 阅读 · 0 评论 -
Java数据结构与算法———(42)快速排序
快速排序一、代码package sort;import java.util.Arrays;public class QuickSort { public static void main(String[] args) { int[] arr = {-9, 78, 0, 23, -567, 70, -1, 900, 4561}; quickSort(arr, 0, arr.length - 1); System.out.println("快速排序后:" + Arrays.toStrin原创 2020-07-21 21:29:30 · 132 阅读 · 0 评论 -
Java数据结构与算法———(41)测试希尔排序(移动法)所花费的时间
用80000个数据对希尔排序法(移动法)进行测试。移动法的希尔排序法,处理速度非常快,处理800000个数据也只需要2秒。一、代码package sort;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;public class ShellSort { public static void main(String[] args) { //用80000个随机数据测试希尔排序算原创 2020-07-21 21:26:47 · 219 阅读 · 0 评论 -
Java数据结构与算法———(40)希尔排序(移动法)
希尔排序移动法,是插入排序的改进版。一、代码import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;public class ShellSort { public static void main(String[] args) { int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};//共10个数 System.out.println("希尔排序前原创 2020-07-21 21:19:04 · 119 阅读 · 0 评论 -
Java数据结构与算法———(39)测试希尔排序(交换法)花费的时间
用80000个数据测试希尔排序(交换法)的速度。希尔排序法是改进的插入排序法,但是经过测试后发现并没有比插入排序法更快,原因在于使用交换法时耗费了很多时间。一、代码package sort;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;public class ShellSort { public static void main(String[] args) { //用原创 2020-07-21 14:15:54 · 144 阅读 · 0 评论 -
Java数据结构与算法———(38)希尔排序(交换法)简洁版
简洁版的希尔排序算法,采用移动法。一、代码package sort;import java.util.Arrays;public class ShellSort { public static void main(String[] args) { int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};//共10个数 shellSortByChange(arr); } public static void shellSortByChange(in原创 2020-07-21 14:00:57 · 137 阅读 · 0 评论 -
Java数据结构与算法———(37)希尔排序(交换法)详解
希尔排序有两种方法:交换法和移动法,本文采用交换发,效率较低,但容易理解。一、代码package sort;import java.util.Arrays;public class ShellSort { public static void main(String[] args) { int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};//共10个数 shellSortByChange(arr); } public static void原创 2020-07-21 13:58:43 · 201 阅读 · 0 评论 -
Java数据结构与算法———(36)测试插入排序花费的时间
用80000个随机整数测试插入排序所耗费的时间。通过观察得知,插入排序的时间复杂度也是O(n2n^2n2)。通过实验对比可知,插入排序的速度介于选择排序和冒泡排序之间。一、代码import java.text.SimpleDateFormat;import java.util.Date;public class InsertSort { public static void main(String[] args) { // 测试一个80000个数组的数组 int[] arr = new原创 2020-07-21 11:39:29 · 459 阅读 · 0 评论 -
Java数据结构与算法———(35)插入排序归纳优化版
在逐步分解的基础上,归纳总结出插入排序算法的步骤。一、代码import java.util.Arrays;public class InsertSort { public static void main(String[] args) { int[] arr = {101, 34, 119, 1, -1, 89, 108, 110, 520}; System.out.println("插入排序前:"); System.out.println(Arrays.toString(arr));原创 2020-07-21 11:21:00 · 114 阅读 · 0 评论 -
Java数据结构与算法———(34)插入排序详解
详解插入排序,逐步分解,便于理解。一、代码package sort;import java.util.Arrays;public class InsertSort { public static void main(String[] args) { int[] arr = {101, 34, 119, 1}; System.out.println("排序前:"); System.out.println(Arrays.toString(arr)); insertSort(a原创 2020-07-21 11:03:00 · 101 阅读 · 0 评论 -
Java数据结构与算法———(33)测试选择排序花费的时间
通过实测,得出选择排序比冒泡排序耗费的时间要低很多。虽然选择排序和冒泡排序的时间复杂度都为O(n2n^2n2),但实际上选择排序要比冒泡排序更快。一、代码import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;public class SelectSort { public static void main(String[] args) { // 测试80000个随机数据的排序耗时原创 2020-07-20 21:33:47 · 238 阅读 · 0 评论 -
Java数据结构与算法———(32)选择排序详解
对选择排序进行详细分解,逐步递进,便于理解选择排序。一、代码import java.util.Arrays;public class SelectSort { public static void main(String[] args) { int[] arr = { 101, 34, 119, 1 }; System.out.println("选择排序前:"); System.out.println(Arrays.toString(arr)); // 选择排序 sel原创 2020-07-20 21:24:48 · 110 阅读 · 0 评论 -
Java数据结构与算法———(31)测试冒泡排序花费的时间
用冒泡排序对80000个数据进行排序,并测试所耗费的时间。注意:每次耗费的时间可能都不一样。一、代码import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;public class BubbleSort { public static void main(String[] args) { // 定义一个数组 // int[] arr = {1, 2, 3, 4, 5, 6};//原创 2020-07-20 13:52:43 · 729 阅读 · 0 评论 -
Java数据结构与算法———(30)冒泡排序优化,封装成一个方法
对冒泡排序进行优化,若某一趟冒泡排序中没有进行相邻两个变量之间的数据交换,就说明经过该趟冒泡排序后,整个数值序列已经排好序了。将相关的代码封装成一个方法,以方便使用。一、代码import java.util.Arrays;public class BubbleSort { public static void main(String[] args) { // 定义一个数组 int[] arr = {1, 2, 3, 4, 5, 6};// 共有5个数要进行冒泡排序,则共进行4趟冒泡排序原创 2020-07-20 13:19:35 · 373 阅读 · 0 评论 -
Java数据结构与算法———(29)冒泡排序优化
对冒泡排序进行优化,若某一趟冒泡排序中没有进行相邻两个变量之间的数据交换,就说明经过该趟冒泡排序后,整个数值序列已经排好序了。比如6个数[1, 2, 3, 4, 5, 6],实际上已经排好序了。当用优化后的冒泡排序对这6个数进行排序后,在进行第一趟排序时,发现并没有发生交换,于是程序就判断对这6个数进行的冒泡排序已经完成了,事实也确实如此。一、代码import java.util.Arrays;public class BubbleSort { public static void main原创 2020-07-20 11:17:51 · 126 阅读 · 0 评论 -
Java数据结构与算法———(28)冒泡排序详解
冒泡排序的时间复杂度是O(n2n^2n2)。一、代码package sort;import java.util.Arrays;/** * 展示冒泡排序法的过程,有n个数要进行冒泡排序,则要进行n-1趟排序 * * @author Lee * */public class BubbleSort { public static void main(String[] args) { // 定义一个数组 int[] arr = { 3, 9, -1, 10, -2 };// 共原创 2020-07-20 10:45:13 · 106 阅读 · 0 评论 -
Java数据结构与算法———(27)八皇后问题
八皇后问题:在8 × 8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。一、代码package recursion;/** * 八皇后问题:在8 × 8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 * 说明:理论上应该创建一个二维数组来表示棋盘,但是实际上可以通过算法,用一个一维数组即可解决问题。arr[8] = {0 , 4, 7, 5, 2, 6, *原创 2020-07-19 15:47:11 · 238 阅读 · 0 评论 -
Java数据结构与算法———(26)将中缀表达式转换成后缀表达式
迷宫问题:一个小球在一个8 x 8的棋盘上面找路径,用递归解决。一、代码package recursion;public class MiGong { public static void main(String[] args) { /* * 用二维数组模拟一个迷宫 */ // 地图 int[][] map = new int[8][7]; // 使用1表示墙 // 上下全部置为1 for (int i = 0; i < 7; i++) { map原创 2020-07-19 09:36:34 · 117 阅读 · 0 评论 -
Java数据结构与算法———(25)将中缀表达式转换成后缀表达式
将一个中缀表达式转换成后缀表达式。一、代码package stack;import java.util.ArrayList;import java.util.List;import java.util.Stack;public class PolandNotation { public static void main(String[] args) { /* // 一、 用栈计算后缀表达式 // 先定义一个逆波兰表达式(字符串) // (3+4)x5-6 => 3原创 2020-07-16 20:58:33 · 195 阅读 · 0 评论 -
Java数据结构与算法———(24)用Java包中的栈计算逆波兰表达式(后缀表达式)
用Java包中的栈来计算逆波兰表达式,也即后缀表达式。一、代码package stack;import java.util.ArrayList;import java.util.List;import java.util.Stack;public class PolandNotation { public static void main(String[] args) { // 先定义一个逆波兰表达式(字符串) // (3+4)x5-6 => 3 4 + 5 x 6 -原创 2020-07-16 14:00:15 · 131 阅读 · 0 评论 -
Java数据结构与算法———(23)用Java写一个栈,并来计算中缀表达式(操作数可以是多位数)
用栈计算中缀表达式,可以处理操作数是多位数的情况。一、代码package stack;public class Calculator { public static void main(String[] args) { // 定义一个字符串用于存放表达式 String expression = "30+20*7-220";// 中缀表达式 // 创建两个栈,一个是数栈,一个是符号栈 ArrayStack1 numStack = new ArrayStack1(10); Arr原创 2020-07-14 23:11:43 · 326 阅读 · 0 评论 -
Java数据结构与算法———(22)用Java写一个栈,并用来计算中缀表达式(操作数是一位数)
用栈计算中缀表达式,缺点是操作数只能是个位数。一、代码package stack;public class Calculator { public static void main(String[] args) { // 定义一个字符串用于存放表达式 String expression = "3+2*7-2";//中缀表达式 // 创建两个栈,一个是数栈,一个是符号栈 ArrayStack1 numStack = new ArrayStack1(10); ArrayStack原创 2020-07-14 22:30:58 · 159 阅读 · 0 评论 -
Java数据结构与算法———(21)用数组模拟栈
用数组模拟栈一、代码package stack;import java.util.Scanner;public class ArrayStackDemo { public static void main(String[] args) { // 测试创建栈 ArrayStack stack = new ArrayStack(4); String key = "";// 空串 boolean loop = true;// 控制是否退出菜单 Scanner scanner =原创 2020-07-14 00:56:40 · 156 阅读 · 0 评论