数据结构与算法
墨玉浮白
这个作者很懒,什么都没留下…
展开
-
栈
栈可以理解为一个有底的瓶子,先进后出,后进先出,这是栈的特点。在栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入、删除数据。当然,也不能简单将其定性为“局限性”。因为特定的数据结构是为了对应特定场景,数组、链表暴露了很多操作接口显得比较灵活,但是使用起来可控性上不强,容易出问题。当某个数据集合只涉及在一端插入和删除数据、且满足先进先出、后进后出的特点时,首选栈。实现栈可以使用...原创 2019-12-19 16:24:45 · 334 阅读 · 0 评论 -
队列
文章目录简介顺序队列和链式队列顺序队列链式队列循环队列阻塞队列和并发队列思考简介队列,就是一个“没有底的瓶子”。先进先出,就是典型的队列特点。栈支持入栈push和出栈pop,队列支持入队enqueue和出队dequeue,从队列头部取元素。和栈一样,队列也是一种操作受限的线性表结构数据。队列的应用广泛,如①底层系统、框架、中间件中的循环队列、阻塞队列、并发队列;②Java concurren...原创 2019-12-19 13:32:54 · 271 阅读 · 0 评论 -
链表
文章目录前言一、链表1.1 单链表1.2 循环链表1.3 双向链表二、基于链表实现LRU缓存淘汰算法三、挑战链表的技巧3.1 理解指针或引用3.2 注意内存泄漏和指针丢失3.3 利用哨兵简化3.4 边界条件3.5 画图辅助四、常见链表操作前言链表和数组都是非常基础、常用的数据结构,数组需要一块连续的内存空间来存储数据(即使可用总空间足够,不连续也不行),而链表只需要由“指针”将一组零散的内存块...原创 2019-12-16 20:03:32 · 366 阅读 · 0 评论 -
数组
文章目录一、关键词1.1 线性表1.2 非线性表1.3 连续的内存空间和相同类型的数据二、数组如何根据下标随机访问数组元素?三、插入、删除的低效性3.1 插入3.2 删除四、警惕数组问题4.1 数组越界问题4.2 数组可替代性?五、总结一、关键词数组Array是一种线性表数据结构,用一组连续的内存空间,来存储一组具有相同类型的数据。1.1 线性表数据像一条线一样的排列,线性表上的数据只...原创 2019-12-12 17:02:11 · 203 阅读 · 1 评论 -
红黑树学习笔记
吐槽一下原创 2019-04-11 16:57:00 · 270 阅读 · 0 评论 -
经典算法之堆排序
堆排序以堆的方式去排序,使最大值位于根节点,之后就缩小尺寸,调整位置。时间复杂度O(n logn),不是很稳定算法步骤1.创建一个堆2.把堆首最大值和堆尾互换位置3.缩小堆尺寸,调整位置4.重复…直至堆尺寸为1直接上代码private int[] heapSort(int[] source) { int[] arr = Arrays.copyOf(source, s...原创 2019-04-09 13:56:41 · 124 阅读 · 0 评论 -
经典算法之希尔排序
希尔排序是插入排序的升级版,设置一个gap增量把未排序序列分组、插入排序,继续缩小gap分组、插入排序直至gap为1。只需最后微调一下,就OK啦。算法步骤:1.设定gap将序列分组2.对以上分组进行插入排序3.缩小gap来分组并继续插入排序4.直至gap为1,微调直接上代码 private int[] shellSort(int[] source) { // 对 a...原创 2019-04-09 11:03:02 · 125 阅读 · 0 评论 -
经典算法之插入排序
插入排序将一个序列的第一个元素固定作为有序序列,扫描剩余元素并插入到有序数列的合适位置;时间复杂度O(n)~O(n²),比较稳定的!算法步骤1.待排序序列中挑出第一个元素作为有序序列固定,剩余未无序序列2.从头到尾扫描未排序无序序列,将扫描到的每个元素都插入到有序序列的合适位置直接上代码/** * 插入排序,固定住第一个,遍历剩下的并插入到合适位置。 * */ ...原创 2019-04-09 09:47:34 · 138 阅读 · 0 评论 -
经典算法之选择排序
选择排序核心就是找到最小(大)的元素,并在剩余元素中继续找最小(大)并放有序数列后,重复N次;时间复杂度O(n²),不是很稳定啊!算法步骤1.首先在未排序的数列中找到最小(大)的元素放在首位2.再剩余元素中继续挑出一个最小(大)的元素,放在步骤1所在序列的后面3.重复…直接上代码/** * 选择排序,先找到最小(大)的元素 * 再在剩余元素中继续挑最小(大)元素,...原创 2019-04-09 09:37:10 · 124 阅读 · 0 评论 -
经典算法之冒泡排序
冒泡排序比较两个相邻的元素,将较大的一个交换到右边算法步骤1.比较两个相邻的元素,谁大谁就往右交换2.对每一组相邻的元素都做以上处理,最后最右侧的一定的最大的3.从头到尾再来一次…4.直到没有元素可以比较了,就结束了直接上代码 /** * 冒泡排序,比较相邻两个元素,大就交换位置 * 一轮一轮又一轮 */ public int[] bubble...原创 2019-04-08 20:42:18 · 144 阅读 · 0 评论 -
经典算法之快速排序
快速排序快速排序的核心,就是给基准数据找到正确索引位置的过程。算法步骤1.从数列中挑出一个元素,作为基准2.重新对数列排序,比基准小的放在一边,比基准大的放在另一边。如此一轮结束后,基准就处于了分区的中间位置3.分别对左右两边,递归的排序N轮直接上代码/** * 快速排序,数组中挑出一个元素作为基准值,比基准值小的放左边,大的放右边。 * 递归的把左右两边的元素排...原创 2019-04-08 20:25:58 · 337 阅读 · 0 评论 -
经典算法之归并排序
归并算法归并算法的核心就是分而治之。算法步骤1.开辟一块空间,用于存放合并后的序列2.设定两个指针,起始位置分别位于两个已排序序列的起始位置3.比较两个指针所代表的元素,将更小的元素放入合并空间,并将指针后移4.重复步骤3,直至有一个指针到达尾部5.将另一个序列的剩余元素复制到合并序列尾部直接上代码public int[] sort(int[] sourceArray) { ...原创 2019-04-08 20:12:28 · 4810 阅读 · 5 评论