数据结构与算法
程序=数据结构+算法
ll_j_21
java小白
展开
-
稀疏数组
package com.study.sparsearray;import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.原创 2020-08-12 20:34:29 · 127 阅读 · 0 评论 -
树形结构----最大堆与优先队列
package 树形结构;import shixianClass.ArrayList;import java.util.Iterator;//最大堆public class MaxHeap<E extends Comparable<E>> implements Iterable<E> { //用ArrayList当做最大堆的存储容器 private ArrayList<E> data; public MaxHeap(...原创 2020-07-26 18:05:47 · 145 阅读 · 0 评论 -
树形结构-------AVL平衡树
package 树形结构;import org.omg.PortableInterceptor.SUCCESSFUL;import shixianClass.ArrayList;import shixianClass02.LinkedList;import shujujiegou_interface.List;import shujujiegou_interface.Map;import shujujiegou_interface.Set;//底层由AVL树实现的映射publi...原创 2020-07-26 14:47:20 · 85 阅读 · 0 评论 -
树形结构----二分搜索树与映射
一个键只能对应一个值或者多个值对应一个键定义接口package shujujiegou_interface;public interface Map<K,V> { public void put(K key,V value); public V remove(K key); public boolean contains(K key); public V get(K key); public void set(K key,V value);原创 2020-07-24 23:35:25 · 155 阅读 · 0 评论 -
树形结构----二分搜索树与集合
存储不重复元素的容器,有链表LinkedSet有序,由二分搜索树实现ThreeSet有序 自然排序,由哈希表实现HashSet无序。集合set接口定义package shujujiegou_interface;public interface Set<E> extends Iterable<E>{ public void add(E element); public void remove(E element); public boolean cont原创 2020-07-21 13:37:37 · 141 阅读 · 0 评论 -
树形结构----二分搜索树
添加元素原创 2020-07-20 23:34:31 · 91 阅读 · 0 评论 -
树形结构-----二叉树基本概念
原创 2020-07-10 22:05:26 · 110 阅读 · 0 评论 -
排序算法-----基数排序
基数排序是按照低位先排序,然后收集;在按照高位排序,然后在收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,在按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。时间复杂度:O(n+m)空间复杂度:O(n+m)稳定性:稳定package 排序算法;import shixianClass.ArrayLoopQueue;import java.util.Arrays;import java.util.Random;public cl原创 2020-07-05 16:50:18 · 150 阅读 · 0 评论 -
排序算法----桶排序
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序的工作原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶在分别排序(有可能在使用别的排序算法或是以递归方式继续使用桶排序进行排)时间复杂度:O(n+m)空间复杂度:O(n+m)稳定性:稳定package 排序算法;import shixianClass.ArrayList;import java.util.Arrays;import java.util.Comparator;i原创 2020-07-05 15:59:53 · 198 阅读 · 0 评论 -
排序算法-----计数排序
计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中,作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。时间复杂度:O(n+m)空间复杂度:O(n+m)稳定性:稳定package 排序算法;import java.util.Arrays;import java.util.Random;public class CountingSort { public static void main(String[] args)原创 2020-07-05 14:41:10 · 114 阅读 · 0 评论 -
排序算法-----快速排序
快速排序快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,比另一部分的关键字大,则可分别对这两部分记录继续进行排序,以达到整个序列有序。时间复杂度:O(nlog2n)空间复杂度:O(1)稳定性:不稳定单路快速排序package 排序算法;import java.util.Arrays;import java.util.Random;//单路快速public class QuickSort01 { public原创 2020-07-04 22:08:01 · 162 阅读 · 0 评论 -
排序算法------堆排序
堆排序是指利用堆这种数据结构所设计的一种排序算法,堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父结点。时间复杂度:O(n1og2n)空间复杂度:O(1)稳定性:不稳定先堆化package 排序算法;import java.util.Arrays;import java.util.Random;public class HeapSort { public static void main(String[] args) {原创 2020-07-03 13:37:56 · 110 阅读 · 0 评论 -
排序算法----归并排序
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,在使子序列段有序。若将两个有序表合并成一个有序表,称为2路归并。时间复杂度:O(nlog2n)空间复杂度:O(n)稳定性:稳定package 排序算法;import java.util.Arrays;import java.util.Random;public class MergSort { public static voi原创 2020-07-02 11:20:24 · 131 阅读 · 0 评论 -
排序算法-----希尔排序
1959年Shell发明,第一个突破O(n^2)的排序算法,是简单插入排序的改进版,它与插入排序的不同之处在于,他会优先比较距离较远的元素,希尔排序又叫缩小增量排序。时间复杂度:O(n^1.3)空间复杂度:O(1)稳定性:不稳定package 排序算法;import java.util.Arrays;//O(n^1.3)public class ShellSort { public static void main(String[] args) { int ar原创 2020-07-01 14:26:18 · 99 阅读 · 0 评论 -
排序算法--------插入排序
插入排序插入排序的算法描述是一种简单直观的排序算法,他的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。时间复杂度:O(n^2)空间复杂度:O(1)稳定性:稳定package 排序算法;import java.util.Arrays;//冒泡 选择 插入 虽然都是O(n^2) 但是插入更快一点 public class insertionSort { public static void main(String[] args) {原创 2020-07-01 14:03:15 · 117 阅读 · 0 评论 -
排序算法-----冒泡排序
冒泡排序是一种简单的排序算法,他重复的走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复低进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。时间复杂度:O(n^2)空间复杂度:O(1)稳定性:稳定package 排序算法;import java.util.Arrays;public class BubbleSort { public static void main原创 2020-07-01 12:18:26 · 87 阅读 · 0 评论 -
排序算法-----选择排序
排序算法就是使用一串记录,按照其中的某个或某个关键字的大小,递增或递减的排列起来的操作。比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。(选择排序、冒泡排序、插入排序、希尔排序、归并排序、堆排序、快速排序)非比较类排序:不通过比较来决定元素之间的相对次序,他可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。(计数排序、桶排序、基数排序)排序的相关概念**稳定:**如果a原本在b前面,而a原创 2020-07-01 12:01:05 · 101 阅读 · 0 评论 -
查找算法----斐波那契查找
package 查找算法;import java.util.Arrays;//斐波那契查找public class FibonacciSearch { public static void main(String[] args) { int [] arr={1,5,12,21,30,32,55,68,80,89,90,99}; int key=30; int index=fibonacciSearch(arr,key); ..原创 2020-06-30 23:07:41 · 155 阅读 · 0 评论 -
查找算法----插值查找
package 查找算法;public class InterpolationSrarch { public static void main(String[] args) { int arr[]={1,5,12,21,30,32,55,68,80,89,90,99}; int key=30; int index=interpolationSrarch(arr,key,0,arr.length-1); System.out.pr..原创 2020-06-30 20:16:03 · 146 阅读 · 0 评论 -
查找算法----二分查找
二分查找也称为折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线性表分成两个子表,若相等则查找成功,若不相等,在根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或者找结束发现表中没有这样的点。元素必须是有序的,如果是无序的则要先进行排序操作。时间复杂度为O(loig2n)折半查找的前提是需要有序表顺序存储,对于静态查找表,一次排序后不再变化,折半查找能得到不错的效率。但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工原创 2020-06-30 19:29:47 · 198 阅读 · 0 评论 -
查找算法-----线性查找(顺序查找)
根据给定的某个值,在查找表中确定一个其关键字等于给定值得数据元素(或记录)顺序查找二分查找插值查找斐波那契查找树表查找分块查找哈希查找顺序查找顺序查找也称为线形查找,属于无序查找算法,从数据结构线形查找表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。顺序查找适合于存储结构为顺序存储或链式存储的线性表顺序查找的时间复杂度为O(n)package 查找算法;public class L原创 2020-06-30 18:43:43 · 301 阅读 · 0 评论 -
分治回溯-----回溯的问题之数独问题
package 分治回溯;import java.util.Scanner;public class Sudcku { public static void main(String[] args) { int [][] board=new int[9][9]; Scanner scanner=new Scanner(System.in); //"005300000" for (int i=0;i<board.length.原创 2020-06-19 12:54:57 · 150 阅读 · 0 评论 -
分治回溯-----回溯的问题之八皇后问题
package 分治回溯;public class EightQueen { //定义一个解的编号 private static int count=0; private static final int SIZE=8; public static void main(String[] args) { int[][] arr=new int[SIZE][SIZE]; eightQueen(0,arr); } priv.原创 2020-06-19 11:52:45 · 352 阅读 · 0 评论 -
分治回溯-----回溯的应用之迷宫问题
import shixianClass02.LinkedList;public class Maze { private static int [][]maze={ {1,1,1,1,1,1,1,1,1}, {0,0,1,0,0,0,1,1,1}, {1,0,1,1,1,0,1,1,1}, {1,0,0,1,0,0,1,1,1}, {1,1,0,1,1,0,0,0,1}, {1,0,0,0,0,0..原创 2020-06-18 19:43:20 · 160 阅读 · 0 评论 -
分治回溯-----分治的应用之汉诺塔问题
public class Hanoi { public static void main(String[] args) { String x="X"; String y="Y"; String z="Z"; hanoi(3,x,y,z); } private static void hanoi(int level, String begin, String mid, String to) { if ..原创 2020-06-18 17:58:24 · 192 阅读 · 0 评论 -
分治回溯----分治的之棋盘覆盖问题
package 分治回溯;/*利用分治法,将方形棋盘分为四个部分如果该特殊点在其中的某一部分,我们就接着去递归处理即可如果不存在特殊点的部分,我们假设一个特殊点,同样的递归下去即可直到全覆盖位置左上角的棋盘 若不存在特殊点 该棋盘的右下角为特殊点右上角的棋盘 若不存在特殊点 该棋盘的左下角为特殊点左下角的棋盘 若不存在特殊点 该棋盘的右上角为特殊点右下角的棋盘 若不存在特殊点 该棋盘的左上角为特殊点 */import java.util.Scanner;public c...原创 2020-06-17 22:48:58 · 212 阅读 · 0 评论 -
分治回溯-----分治的应用之全排列问题
public class FullPermutation { private static TreeSet<String> set=new TreeSet<>(); public static void main(String[] args) { String s="ABC"; char[] arr=s.toCharArray(); permutation(arr,0,arr.length-1); ..原创 2020-06-17 13:58:51 · 116 阅读 · 0 评论 -
分治回溯-----分治的应用之大整数乘法问题
public class BigIntegerMultiplication { public static void main(String[] args) { long x=12345678; long y=12345678; // System.out.println(x*y); long product=multi(x,y,4); System.out.println(product); } p..原创 2020-06-16 21:38:50 · 122 阅读 · 0 评论 -
分治回溯------递归与分治
递归程序调用自身的编程技巧称为递归public static void show(){ show();}它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。递归前进段边界条件递归返回段分治算法分治算法就是将原问题划分成n个规模较小,并且结构与原问原创 2020-06-16 13:34:23 · 244 阅读 · 0 评论 -
动态链表-----双向循环链表的实现
LinkedList类实现List、Deque、Stackpackage shixianClass02;import shujujiegou_interface.Deque;import shujujiegou_interface.List;import shujujiegou_interface.Stack;import java.util.Comparator;import java.util.Iterator;public class LinkedList<E&..原创 2020-06-11 18:35:29 · 145 阅读 · 0 评论 -
动态链表----单向循环链表的应用之逢七过
package shixianClass02;import shixianClass.ArrayList;public class SevenGam { public static void main(String[] args) { int M=5;//M个人 int N=50;//N个数 默认从1开始 LinkedSinglyCircularList<ArrayList<String>> list=new Lin..原创 2020-06-11 16:16:57 · 110 阅读 · 0 评论 -
动态链表----单向循环链表的应用之约瑟夫环
方法一在单向循环链表内部解决 public void josephusLoop(){ if (size<=2){ return; } Node p=head; while (size!=2){ p=p.next; //删除结点 Node del=p.next; if (del==head){ ..原创 2020-06-11 15:50:16 · 251 阅读 · 0 评论 -
动态链表----单向循环链表的实现
单向循环链表LinkedSinglyCircularListpackage shixianClass02;import shujujiegou_interface.List;import java.util.Comparator;import java.util.Iterator;//单向循环链表public class LinkedSinglyCircularList<E> implements List<E> { //定义出一个结点 内部类 .原创 2020-06-11 14:21:09 · 143 阅读 · 0 评论 -
动态链表-----单向链表的实现
单向链表LinkedSinglyListLinkedSinglyList就是线性结构链式存储方式的具体实现,称为单链表package shixianClass02;import org.omg.CORBA.NO_IMPLEMENT;import shixianClass.ArrayList;import shujujiegou_interface.List;import java.util.Comparator;import java.util.Iterator;//单向链表原创 2020-06-10 20:08:48 · 137 阅读 · 0 评论 -
动态链表
单向链表单向循环链表双向循环链表链栈链队列动态链表原创 2020-06-10 14:36:19 · 98 阅读 · 0 评论 -
动态数组-----双端队列的实现
双端队列定义Deque接口public interface Deque<E> extends Queue<E> { public void addFirst(E element); public void addLast(E element); public E removeFirst(); public E removeLast(); public E getFirst(); public E getLast(); p原创 2020-06-09 20:03:09 · 208 阅读 · 0 评论 -
动态数组-----循环队列的实现
队列优化ArrayLoopQueue类package shixianClass;import shujujiegou_interface.Queue;import java.util.Arrays;import java.util.Iterator;public class ArrayLoopQueue<E> implements Queue<E> { //存储元素的容器 private E[] data; //队首指针front原创 2020-06-09 15:01:43 · 165 阅读 · 0 评论 -
动态数组-----队列的应用之队列实现栈
B队列不用暂存而是下一次直接用//队列实现栈public class QueueToStack { public static void main(String[] args) { StackImplByQueue<Integer> stack=new StackImplByQueue<>(); for(int i=1;i<=12;i++){ stack.push(i); }原创 2020-06-08 20:57:54 · 126 阅读 · 0 评论 -
动态数组-----队列的应用之栈实现队列
//栈实现队列public class StackToQueue { public static void main(String[] args) { QueueImpIByStack<Integer> queue=new QueueImpIByStack<>(); for(int i=1;i<=10;i++){ queue.offer(i); } System.out.pri..原创 2020-06-08 19:55:58 · 170 阅读 · 0 评论 -
动态数组----队列的应用之文件夹遍历
package shixianClass;import java.io.File;//文件夹遍历public class DirectorTraversal { public static void main(String[] args) { File dir=new File("D:\\ideaIE-2020.1space"); ArrayQueue<File> queue=new ArrayQueue<>(); .原创 2020-05-27 20:49:10 · 118 阅读 · 0 评论