极客时间:https://time.geekbang.org/column/intro/100017301?tab=catalog \
Java及各版本 github地址:https://github.com/wangzheng0822/algo
本仓库跟随极客时间王争老师的《数据结构与算法之美》课程进行相关数据结构的学习与代码实践
windows 10 系统自带WSL linux子系统 gcc 版本 gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)
-
数组 数组空间的申请、数据的增加、删除、查找、打印等功能
-
链表 单链表中元素的增加、删除、查找、翻转、获取中位数等功能 通过双指针策略,实现了通过出参返回插入元素地址 意识到二级指针在链表中的重要意义:有效地利用二级指针,将其作为管理和操作链表的首要选项,并在博客:https://www.cnblogs.com/whiteBear/p/16183348.html 进行了相应的补充
双向链表:插入元素(头插法)、删除元素(尾删、指定节点删)、遍历链表、LRU(最近最少使用)缓存算法等双链表实现
链表相关的算法: 0) 遍历单链表
- 单链表反转
- 链表中环的检测
- 两个有序的链表合并
- 删除链表倒数第n个结点
- 求链表的中间结点 涉及C++中模板(template)、using关键字(定义类型别名)、make_shared初始化等
-
栈 分别通过数组、链表两种实现方式,实现了栈的初始化、入栈、出栈、获取栈大小等功能
-
队列 基于数组、链表的队列,循环队列,阻塞队列、并发队列
阻塞队列,在多线程情况下,会有多个线程同时操作队列,会存在线程安全的问题,因此需要实现一个线程安全的队列--并发队列 并发队列最简单的实现方法就是:直接在 enqueue()、dequeue() 方法上加锁,但是锁粒度大并发度会比较低,同一时刻仅允许一个存或者取操作。实际上,基于数组的循环队列,利用CAS(Compare and Swap)原子操作,可以实现非常高效的并发队列。这也是循环队列比链式队列应用更加广泛的原因。
-
递归 递归需要满足三个条件: 1)一个问题的解可以分解为几个子问题的解 2)这个问题与分解后的子问题,除了数据规模不同,求解思路完全一样 3)存在递归终止条件 写递归代码最关键的是写出递推公式,找到终止条件
-
排序 O(n^2) 冒泡排序、插入排除、选择排序、希尔排序(时间复杂度为均为O(n^2),属于原地排序,但冒泡排序和插入排序属于稳定排序) O(nlog(n))、不稳定 快速排序、归并排序 O(n)、稳定的 计数排序、桶排序、