- 博客(33)
- 收藏
- 关注
原创 二分查找和插值查找
二分查找和插值查找二分查找二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。查找过程首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成
2022-02-16 19:57:58
248
原创 排序算法之快速排序
快速排序什么是快速排序快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,比另一部分的关键字大,则可分别对这两部分记录继续进行排序,以达到整个序列有序。时间复杂度:O(nlgn)空间复杂度:O(1)稳定性:不稳定图解快速排序单路快速排序代码public void sort(int[] arr) { quickSort(0, arr.length - 1); } private void qu
2022-02-16 19:32:02
464
原创 排序算法之希尔排序
希尔排序什么是希尔排序1959年Shell发明,第一个突破O(n^2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。时间复杂度:O(n^1.3)空间复杂度:O(1)稳定性:不稳定希尔排序代码public void sort(int[] arr) { int len = arr.length; //O(n^1.3) for (int gap = len / 2; gap
2022-02-14 21:12:59
309
原创 排序算法之归并排序
归并排序什么是归并排序归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2路归并。时间复杂度:O(nlgn)空间复杂度:O(n)稳定性:稳定图解归并排序分治法图解“分”过程图解“治”过程归并排序代码public void sort(int[] arr) { mer
2022-02-14 20:13:01
364
原创 排序算法之插入排序
插入排序什么是插入排序插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。时间复杂度:O(n^2)空间复杂度:O(1)稳定性:稳定插入排序代码public void sort(int arr[]) { for (int i = 1; i < arr.length; i++) { int e = arr[i];
2022-02-13 22:28:12
255
原创 排序算法之冒泡排序
冒泡排序什么是冒泡排序冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。时间复杂度:O(n^2)空间复杂度:O(1)稳定性:稳定冒泡算法代码public void sort(int arr[]) { for (int i = 0; i < arr.length - 1
2022-02-13 22:17:11
287
原创 排序算法之选择排序
选择排序什么是选择排序选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。时间复杂度:O(n^2)空间复杂度:O(1)稳定性:不稳定选择排序代码public void sort(int[] arr) { for (int i = 0; i < arr.length -
2022-02-13 22:06:10
82
原创 用Maven模块搭建SSM(Spring+SpringMVC+MyBatis)入门练习
用Maven模块搭建SSM(Spring+SpringMVC+MyBatis)入门练习
2022-01-29 13:09:22
687
原创 Java数据结构与算法笔记_day07(排序算法)
排序算法什么是排序算法?就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。选择排序、冒泡排序、插入排序、希尔排序、归并排序、堆排序、快速排序非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。计数排序、桶排序、基数排序排序的相关概念稳定:如果a原本在b前
2022-01-23 18:10:41
614
原创 回溯的应用之八皇后问题
八皇后问题八皇后问题描述在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。图解四皇后问题由于八皇后问题解决太过于繁琐,因此我们问题简单化,利用四皇后演示解决步骤,并且完成代码实现。八皇后代码实现public class EightQueen { //定义一个解的编号 private static int count = 0; //定义棋盘的尺寸 private static final int SIZE
2022-01-23 14:01:42
330
原创 回溯的应用之迷宫问题
迷宫问题迷宫场景描述迷宫(希腊语:λαβύρινθος,拉丁转写:labyrinthos)指的是充满复杂通道,很难找到从其内部到达入口或从入口到达中心的道路,道路复杂难辨,人进去不容易出来的建筑物。图解迷宫问题解决思路定义坐标先后方向(这里以“上右下左”的顺序为例),以栈的方式存取迷宫坐标数据,进行入栈弹栈操作,以此记录迷宫路线的解迷宫问题代码实现public class Maze { private static int[][] maze = { {1,1,
2022-01-21 22:38:22
173
原创 分治的应用之全排列问题
全排列问题全排列描述求解字符串“ABC”中所有字符的全排列(不包含重复)ABC ACB BAC BCA CAB CBA对于字符串“ABB”而言的所有全排列ABB BAB BBA图解全排列问题全排列代码实现public class FullPermutation { public static void main(String[] args) { String s = "ABC"; char arr[] = s.toCharArray();
2022-01-19 22:25:52
225
原创 Java数据结构与算法笔记_day06(递归与分治)
递归与分治递归的概述程序调用自身的编程技巧称为递归( recursion )它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。用递归思想实现前n项求和问题:public static void main(String[] args){ int n = 100;
2022-01-19 18:20:25
415
原创 分治的应用之棋盘覆盖问题
棋盘覆盖问题:在一个????????×???????? (????≥????)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格。显然,特殊方格在棋盘中可能出现的位置有????^???? 种,因而有????^????种不同的棋盘。棋盘覆盖问题要求用4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。...
2022-01-19 11:35:05
551
原创 Java数据结构与算法笔记_day05(双向循环链表的实现)
双向循环链表的实现双向循环链表的定义双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。图解双向循环链表的操作头尾添加元素中间添加元素头尾删除元素中间删除元素LinkedList类代码实现public class LinkedList<E> implements List<E>, Dequ
2022-01-16 18:32:23
282
原创 单向循环链表之逢七过问题
逢七过问题逢七过规则好友围坐在酒桌前,从任意一人开始轮流报数,数字从10以下任意一个数字开始。凡是遇到任何7的倍数,如14、21或含7的数字如17、27均喊“过”。遇到反应慢了没有敲打桌面的人则失败。失败的惩罚就是罚酒或者表演节目。接下来,被惩罚过的人重新开始报数,可以从10以下任意一个数字开始。图解逢七过问题逢七过代码实现 public static void main(String[] args) { Scanner input = new Scanner(Sys
2022-01-16 17:44:48
594
原创 动态链表之单向循环链表
单向循环链表的实现单向循环列表的定义如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表。图解单向循环链表的操作添加元素删除元素LinkedSinglyCircularList类代码实现public class LinkedSinglyCircularList<E> implements List<E> { //定义出一个节点 内部类 public class Node{ E data
2022-01-15 20:41:43
89
原创 动态链表应用之单向链表
单向链表的实现单向链表的定义单向链表(LinkedSinglyList)就是线性结构链式存储方式的具体实现,称为单链表图解单向链表的操作LinkedSinglyList类的代码实现public class LinkedSinglyList<E> implements List<E> { //定义出一个节点 内部类 public class Node{ E data; //数据域,用来存放数据的 Node next
2022-01-15 20:24:29
213
原创 Java数据结构与算法笔记_day04(动态链表)
动态链表线性结构 + 链式存储 = ?单向链表单向循环链表双向循环链表链栈链队列动态链表的定义头结点 VS 头指针
2022-01-15 19:58:31
115
原创 Java数据结构与算法笔记_day03(双端队列的实现)
双端队列的实现双端队列的定义双端队列(double ended queue ,deque)是限定插入和删除操作在表的两端进行的线性表,是一种具有队列和栈的性质的数据结构图解双端队列的操作双端队列Dequeue接口的定义public interface Deque<E> extends Queue<E> { public void addFirst(E element); public void addLast(E element); public
2022-01-15 12:39:55
212
原创 Java数据结构与算法笔记_day03(循环队列的实现)
循环队列的实现循环队列的定义该循环队列的实现思想也是动态数组,但是由于操作元素的特殊性,并不能直接由ArrayList或ArrayQueue实现,所以从头开始定义ArrayLoopQueue图解循环队列的操作循环队列的扩容缩容图解ArrayLoopQueue类代码实现public class ArrayLoopQueue<E> implements Queue<E> { //存储元素的容器 private E[] data; //队首指针fr
2022-01-14 15:11:20
181
原创 Java数据结构与算法笔记_day03(双端栈的实现)
双端栈的实现双端栈的定义是指将一个线性表的两端当做栈底分别进行入栈和出栈操作主要利用了栈“栈底位置不变,而栈顶位置动态变化” 的特性。双端栈类ArrayDoubleStack类双端栈是线性表的一种,更是栈的一个特殊分类,所以我们可以用动态数组和栈的思想来实现双端栈,毕竟由于其操作过于特殊,并不能借助ArrayList或ArrayStack实现。public class ArrayDoubleEndStack_2<E> implements Iterable<E> {
2022-01-13 22:45:45
141
原创 Java数据结构与算法笔记_day03(队列的实现)
队列的实现队列的定义队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表我们把允许删除的一端称为队首(front),插入的一端称为队尾(rear)不含任何数据元素的队列称为空队列队列是一种先进先出(First In First Out)的线性表,简称FIFO队列本身是一个线性表,其数据元素具有线性关系,只不过它是一种特殊的线性表而已队列的插入操作,叫作入队队列的删除操作,叫作出队Queue队列接口的定义队列可以顺序存储实现也可以链表存储实现所以将共性抽取定义出Queue接口
2022-01-13 13:29:01
117
原创 Java实现回文串判断的方法
Java实现回文串判断的方法回文串是什么?“回文串”是一个正读和反读都一样的字符串,初始化标志flag=true,比如“上海自来水来自海上”或者“sos”等等就是回文串。回文串判断方法实现(1)字符串反转法public boolean isPalindrome(){ String str = "上海自来水来自海上"; StringBuilder sb = new StringBuilder(); sb.reverse(); //将字符串进行反转 String
2022-01-12 23:06:57
3830
原创 Java实现后缀表达式计算器
后缀表达式计算器代码实现public class SuffixCulator { public static void main(String[] args) { String infixExpression = "(10+20/2*3)/2+8"; //"10 20 2 / 3 * + 2 / 8 + " //调用中缀转后缀类的方法 String suffixExpression = InfixToSuffix.infixToSuffix(infixExp
2022-01-11 22:28:26
538
原创 用Java实现中缀表达式转后缀表达式
中缀表达式转后缀表达式后缀表达式后缀表达式又称逆波兰表达式,明显的特点是:逆波兰表达式中没有括号,计算时将操作符之前的第一个数作为右操作数,第二个数作为左操作数,进行计算,得到的值继续放入逆波兰表达式中。 但日常生活中我们总是习惯于写中缀表达式,所以需要先将中缀表达式转为后缀表达式。规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。简单图解后缀表达式opStack用于存储操作符,suffixList用于存
2022-01-11 22:17:36
2635
原创 中缀表达式计算器
中缀表达式中缀表示法(或 中缀记法 )是一个通用的 算术 或 逻辑公式表示方法,操作符是以中缀形式处于 操作数 的中间(例:3 + 4)。与前缀表达式 (例:+ 3 4 )或后缀表达式 (例:3 4 + )相比,中缀表达式不容易被电脑解析,但仍被许多程序语言使用,因为它符合人们的普遍用法。中缀表达式计算器中缀表达式计算器基于ArrayStack实现,它将数字和操作符按照相应的规定分别入栈弹栈于各自的栈,具体实现规定如下:创建两个栈 操作符栈 数字栈如果遇到数字 直接进数字栈如果遇到操作符
2022-01-10 17:16:25
408
原创 Java数据结构与算法笔记_day02(栈的实现)
栈的实现栈的定义:栈是限定仅在表尾进行插入和删除操作的线性表我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)不含任何数据元素的栈称为空栈栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构栈本身是一个线性表,其数据元素具有线性关系,只不过它是一种特殊的线性表而已栈的插入操作,叫作进栈,也称压栈、入栈栈的删除操作,叫作出栈,也称弹栈Stack栈接口的定义:public interface Stack<E> extends
2022-01-09 20:12:00
336
原创 Java数据结构与算法笔记_day02(线性表的实现)
线性表的实现线性表描述:线性表是n个类型相同数据元素的有限序列线性表的逻辑结构线性表是由n(n >= 0)个类型相同数据元素组成的有限序列记作(a1,a2,···,ai-1,ai,ai+1,···,an),即下图List接口定义既然线性结构可以由顺序存储结构和链式存储结构实现,那么将两者对线性结构共同的操作进行抽取,定义出线性结构的接口//线性表接口定义 继承了迭代接口Iterable// List<E> 定义List接口,数据类型为E(不确定数据类型)public
2022-01-09 19:49:55
510
原创 Java数据结构与算法笔记_day01(下)
静态数组与动态数组静态数组特点缺点静态数组创建动态数组静态数组特点Java内置数组的特点:数组的长度一旦确定则不可更改数组只能存储同一类型的数据数组中每个存储空间地址是连续且相等的数组提供角标的方式访问元素缺点Java内置数组的缺点:长度不可变,容量不够用怎么办地址连续且提供角标访问很快,但增删元素怎么办数组只有length这个属性,没有其他的方法静态数组创建Java静态数组,顾名思义,是静态不变的,在内存中位于栈区,是在定义时就已经在栈上分配了固定大小,在运行时这个大小不能改变
2022-01-09 18:55:07
494
原创 Java数据结构与算法笔记_day01(上)
一、数据结构概述数据:信息的载体,它是描述客观事物的数,字符以及所有的输入到计算机中被计算机程序识别加工处理的信息的集合。数据项:字段或域。数据元素:是数据的基本单元,是对一个客观实体的数据描述(信息或成绩一整条)。数据元素有一个或多个数据项组成。数据对象:由相同性质的数据元素组成的,如集合{1,2,3…},{a,b,c…}(可以无限和有限)。数据类型:具有相同性质的计算机数据的集合及定义在这个数据集合上的一组操作的总称(整型,实型。字符型,指针型等)。数据结构:数据之间的相互关系(即数据的组织
2022-01-08 18:32:50
476
空空如也
Java中String数组转换为二维char数组
2023-08-27
TA创建的收藏夹 TA关注的收藏夹
TA关注的人