
数据结构与算法
文章平均质量分 66
学习总结日常
ChenCarry
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode_数组
大致数组的遍历 485、495、414、628统计数组中的元素 645、697、448、442、41、274数组的改变、移动 453、665、283二维数组及滚动数组 118、119、661、598、419数组的旋转 189、396特定顺序遍历二维数组 54、59、498二维数组变换 566、48、73、289前缀和数组 303、304、238数组的遍历485、495、414、628:遍历在遍历中,比较某种频数的最大值或者最小值;或者在遍历中做特殊规律的运算int max_num =原创 2021-09-25 15:14:56 · 205 阅读 · 0 评论 -
排序二叉树(BST)
文章目录描述相关操作完整代码描述英文全称:Binary Sort Tree,它满足以下3个特点:1.一个节点的左节点的值,一定小于它本身节点的值2.一个节点的右节点的值,一定大于它本身节点的值3.一个节点的左右子树,都属于排序二叉树相关操作1、树节点构造class Node { int data; Node left; Node right; public Node() { } public Node(int data) {原创 2020-11-07 18:35:00 · 971 阅读 · 0 评论 -
排序算法8-堆排序
文章目录描述流程代码实现性能描述该算法将序列构建成大(小)顶堆,即完全二叉树,每次构建大小顶堆后,产出目前序列的最大最小值,逐步完成排序流程1、首先将待排序列构建成完全二叉树,从该数非叶子节点开始构建大顶堆2、构建完成后,最大的元素是二叉树的根节点(序列头),将根节点和最后一个叶子节点(序列尾)交换位置,放置在序列最右,作为有序组3、将剩下的无序组继续流程1、2,直至排序结束代码实现/** * 堆排序 */public class HeapSort { public stat原创 2020-10-30 18:34:13 · 111 阅读 · 0 评论 -
排序算法7-基数排序
文章目录描述代码实现性能描述找出序列中值最大的元素,循环它的位数(个、十、百、千……),循环过程中依次对序列中的元素按位数排序,结束后得到有序序列代码实现/** * 基数排序(经典空间换时间) */public class RadixSort { public static void main(String[] args) { //以下为推导过程 int[] arr = {46, 1, 8, 9, 15, 233, 566}; //桶原创 2020-10-29 22:13:47 · 161 阅读 · 0 评论 -
排序算法6-归并排序
文章目录描述代码实现性能描述归并排序采用了“分治”的思想“分”:将大序列逐步分为一个个小序列,可以理解为递归拆分子序列的过程,递归深度为log2n“治”:再将两个有序的小序列排序编回有序的大序列,两个小序列各需要一个指针逐步向后移动,所指元素比对由小至大放入temp,完成后,再将temp中已经完成排序的大序列copy进原序列,完成本次“治”;继续递归,直至整个序列排序完成代码实现/** * 归并排序 */public class MergeSort { public static原创 2020-10-29 21:44:43 · 170 阅读 · 0 评论 -
排序算法5-快速排序
文章目录描述流程代码实现性能描述快速排序是对冒泡排序基础上的优化版本,它打破了冒泡排序只能比对交换相邻元素的方式,并加入了“分治”思想流程1、对一序列,选定最左边的元素作为基数p;再定义i,使i依次从左到右寻找比基数p大的元素;再定义j,使j依次从右到左寻找比基数p小的元素;当i、j每每找到,便交换i、j元素,直到i、j相遇2、将i、j相遇位置的元素与基数p所在元素进行交换,便得到元素p的左边都比p小,右边都比p大3、对元素p的左边序列和右边序列重复走流程1、流程2,直到算法结束代码实现/*原创 2020-10-29 18:07:31 · 436 阅读 · 2 评论 -
排序算法4-希尔排序
描述希尔排序是对插入排序的优化版本,它解决了当较小值出现在序列尾部,需要频繁向前比对的过程流程1、算法对序列进行分组,选取一个gap值作为分组的组数、以及步长(例如gap=5,即分为5组;每组元素相隔步长5,下标0和5一组、下标1和6一组,以此类推)2、对每组进行插入排序(其中插入排序可分为交换法和移位法,移位法效率高)3、对gap值进行模2运算,即gap / 2,并重新进行1、2步骤4、直到gap = 1,即是整个序列为一个分组,并对其进行插入排序后,算法结束代码实现/** * 希尔排序原创 2020-10-28 01:08:13 · 150 阅读 · 0 评论 -
排序算法3-插入排序
描述该算法维护一个有序序列,然后把无序序列中的元素,在有序序列中从后往前进行扫描,找到位置后插入。从一个元素开始,该元素可以认为已经被排序好的。在有序序列从后往前扫描的过程中,也要将已排序的元素逐个后移,为新插入的元素提供位置代码实现/** * 插入排序 */public class InsertSort { public static void main(String[] args) { int[] arr = {3, 9, -1, 10, -20};原创 2020-10-20 15:21:25 · 246 阅读 · 0 评论 -
排序算法2-选择排序
代码实现/** * 选择排序 * 最好最坏时间复杂度:n^2 */public class SelectSort { public static void main(String[] args) { int[] arr = {300, 900, -19, -10, -20}; //默认最小值 int min = 0; //记录最小值下标 int minIndex = 0; for (int i原创 2020-10-20 12:08:16 · 178 阅读 · 0 评论 -
排序算法1-冒泡排序
代码实现/** * 冒泡排序 */public class BubbleSort { public static void main(String[] args) {// int[] arr = {3, 9, -1, 10, -2}; int[] arr = {3, 9, -1, 10, 20}; //交换变量 int temp; //判断上一次是否进行了排序,若上次没有进行排序,证明排序已经提前完成,可提前跳原创 2020-10-19 18:30:12 · 156 阅读 · 0 评论 -
时间复杂度基本概念
计算时间复杂度的方法1、用常数1代替运行时间中的加法常数2、只保留最高阶项3、去除最高阶项的系数常见的时间复杂度1、常数阶O(1)2、对数阶O(log2n)3、线性阶O(n)4、线性对数阶O(nlog2n)5、平方阶O(n^2)6、立方阶O(n^3)7、k次方阶O(n^k)8、指数阶O(2^n)从小到大排序:O(1) < O(log2n) < O(n) < O(nlog2n) < O(n^2) < O(n^3) < O(n^k) < O(原创 2020-10-19 00:37:34 · 338 阅读 · 0 评论 -
八皇后问题
文章目录解题思路代码实现解题思路使用递归回溯法进行解题,递归回溯法区别于穷举法(穷举法便是把8*8棋盘所有摆放放置都试一遍,即8的8次方,共有16777216种摆法,并保留符合要求的摆法),并优于穷举法。当递归到某层失败后,将回溯到上一层递归,很多情况下避免了很多失败的摆法这种方法从棋盘的第一行开始尝试摆放第一个皇后,摆放成功后,递归一层,再遵循规则在棋盘第二行来摆放第二个皇后。如果当前位置无法摆放,则向右移动一格再次尝试,如果摆放成功,则继续递归一层,摆放第三个皇后…如果某一层看遍了所有格子,都无原创 2020-10-16 22:23:50 · 252 阅读 · 1 评论 -
栈
文章目录定义基本实现测试定义栈(Stack)是一种线性存储数据结构,它具有“先进后出”(即LIFO)的特点,且添加(入栈)或者删除(出栈)数据只能在一端进行(即栈顶)基本实现class StackArray { //存放数据的数组 private int[] stack; //栈顶 private int top = -1; //栈大小 private int maxSum = 0; //构建器 public StackArray(i原创 2020-10-14 20:52:43 · 129 阅读 · 0 评论 -
单向环形链表与约瑟夫问题
单向环形链表(CircleSingleLinkedList)单向环形链表,也就是单向循环链表,也就是在单链表的基础上,将尾节点的next指针指回头节点,形成一个环Node节点实现和单链表一样的实现,没什么好说的额/** * 链表节点 */class Node2 { private int no; private Node2 next; public Node2(int no) { this.no = no; } public int原创 2020-05-10 12:51:45 · 157 阅读 · 0 评论 -
双向链表
双向链表(DoubleLinkedList)相比单链表,双向链表中的每个节点都多了个pre指针,并指向前一个节点头结点不可动且不存储数据,仅做指向作用,pre不指向任何节点以下是其增删改查的基本实现package com.cxf.datastructures.linkedlist;/** * 双向链表 */public class DoubleLinkedListDemo { public static void main(String[] args) { Doub原创 2020-05-08 19:26:08 · 193 阅读 · 1 评论 -
单链表
单链表(singleLinkedList)头结点不可动且不存储数据,仅做指向作用单链表每个节点中包含next指针,并指向下一个节点,以此类推以下是其增删改查的基本实现代码实现package com.cxf.datastructures.linkedlist;/** * 单链表 */public class SingleLinkedListDemo { public st...原创 2020-05-05 12:52:32 · 138 阅读 · 0 评论 -
队列
队列(queue)一种只允许一端进行添加数据(入队),另一端进行删除数据(出队)的线性数据结构;它遵循“先进先出”原则,即FIFO;以下Java代码使用数组模拟实现队列1 基本队列首先,基本队列起码都具有四个属性:maxSize 队列容量front 队列头指针(初始值为 -1)rear 队列尾指针(初始值为 -1)arr 存放队列数据的数组注意:front指向的是头数据的前...原创 2020-04-18 14:10:52 · 176 阅读 · 0 评论 -
稀疏数组
应用场景当数组中大部分元素的值都为同一值时(如0),可转换为稀疏数组(如棋盘、地图等)处理方法记录数组共几行几列,有多少个不同的值将不同的值的元素的行、列、值记录到一个小规模数组中,从而缩小规模处理思路代码实现package com.cxf.datastructures.sparsearray;public class SparseArray { public ...原创 2020-03-02 23:51:33 · 109 阅读 · 0 评论 -
数据结构大致
1.线性结构和非线性结构数据结构包括:线性结构和非线性结构1.1线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系(如数组、链表、队列、栈)线性结构又分为顺序储存结构(如数组)和链式储存结构(链表)顺序储存的线性表又叫顺序表,其中的储存数据是连续的链式储存的线性表叫链表,储存数据不一定是连续的,元素中储存着相邻元素的地址信息1.2非线性结构其特点是数据元素之间存...原创 2020-03-01 23:46:48 · 134 阅读 · 0 评论