# study.datastruct.algorithm **Repository Path**: uyong/study.datastruct.algorithm ## Basic Information - **Project Name**: study.datastruct.algorithm - **Description**: 学习数据结构和算法过程中的代码示例 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2019-01-29 - **Last Updated**: 2022-07-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 介绍 学习数据结构和算法过程中的代码示例 ### 排序算法 #### 冒泡排序 时间复杂度:`O(n^2)`
空间复杂度:`O(1)`
稳定,原地 --- #### 插入排序 时间复杂度:`O(n^2)`
空间复杂度:`O(1)`
稳定,原地 --- #### 选择排序 时间复杂度:`O(n^2)`
空间复杂度:`O(1)`
不稳定,原地 >以上三种排序算法时间复杂度都是`O(n^2)`,适合**小规模数据**的排序。**插入排序**应作为首选,因为选择排序不稳定,冒泡排序交换时需要3个操作,插入排序移动时只需1个操作 --- #### 归并排序(分治思想) 时间复杂度:`O(nlogn)`
空间复杂度:`O(n)`
稳定,非原地 --- #### 快速排序(分治分区) 时间复杂度:`O(nlogn)`
空间复杂度:`O(1)`
不稳定,原地 >以上两种排序算法用的都是分治的思想,通过递归实现,需要注意*栈溢出*。快速排序用的比较广泛,虽然归并排序时间复杂度总是保持`O(nlogn)`,而快速排序最坏时间复杂度是`O(n^2)`,但快排空间复杂度低,且退化到`O(n^2)`的概率很小,可以通过合理的选择分区点来避免这种情况 --- #### 桶排序 >基本思想:根据数据的范围[min,max]分配一定数量的桶,每个桶存放桶范围内的数据,桶内的数据用其他排序算法,比如插入排序,最后依次输出每个桶内已排序的数据 时间复杂度:`O(n)`
空间复杂度:`O(n)`
稳定,非原地 >适用场景:外部排序(数据量很大,无法一次性加载到内存中);桶数据分布比较均匀(极端情况,如果数据全被划分到一个桶里,则复杂度要看选择的桶内排序算法) --- #### 计数排序 >基本思想:根据数据的范围[min,max]分配max-min个桶,每个桶对应一种数据的数量,对所有的计数累加(每一项为当前项和前面各项的和),最后根据计数算出数据在有序数组中的实际下标 时间复杂度:`O(n)`
空间复杂度:`O(n)`
稳定,非原地 >适用场景:数据范围不大(数据范围过大会消耗大量内存);非负整数(保证大小不变的情况下可将负数转换为正整数) --- #### 基数排序 >基本思想:将数据按位独立的分割出来做桶排序或者计数排序,这样要保证每个数据长度一样,不足的可以用填充。 时间复杂度:`O(n)`
空间复杂度:`O(n)`
稳定,非原地 >适用场景:数据可以按位分割,位之间有递进关系,比如英文单词和电话号码排序 --- ### 查找算法 #### 二分查找 时间复杂度:`O(logn)`
>适用场景:有序数组,因为二分查找依赖的是数组的随机访问特性 --- ### 树 #### 二叉树 高度、深度、层
前序遍历、中序遍历、后序遍历
遍历时间复杂度:`O(n)`
--- #### 二叉查找树 >定义:树中任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都要大于这个节点的值 >别名:二叉搜索树、二叉排序树 时间复杂度:查找、删除、插入:`O(logn)`,跟树的高度成正比 --- #### 红黑树 >红黑树是一种平衡二叉查找树,用于解决普通二叉查找树在频繁的动态插入、删除等操作下,出现时间复杂度退化到`O(n)`的问题。红黑树的高度近似log2n 时间复杂度:`O(logn)` --- #### 堆 >定义:堆是一种特殊的树,满足两个条件:1.堆是一个完全二叉树;2.堆中的每一个节点的值大于等于(或小于等于)其子树的每个节点的值 时间复杂度:插入、删除:`O(logn)`,排序:`O(nlogn)`
空间复杂度:`O(1)`
排序:原地非稳定 >使用场景:优先级队列、求Top K和求中位数。虽然排序时间复杂度和快排一样,但常用的还是快排。 --- ### 图 #### 深度优先算法 时间复杂度:`O(E)`,E为边数 空间复杂度:`O(V)`,V为顶点数 --- #### 广度优先算法 时间复杂度:`O(E)`,E为边数 空间复杂度:`O(V)`,V为顶点数 --- ####