From 8f3bae6ff453363574f9e5277d12c960e8923c6f Mon Sep 17 00:00:00 2001
From: FrankFeekr <1002039945@qq.com>
Date: Wed, 11 Aug 2021 18:39:24 +0800
Subject: [PATCH 01/10] no message
---
.../data-structures-and-algorithms/README.md | 44 ++++++++++++++-----
1 file changed, 32 insertions(+), 12 deletions(-)
diff --git a/notes/data-structures-and-algorithms/README.md b/notes/data-structures-and-algorithms/README.md
index 63d36e7..3fb34e6 100644
--- a/notes/data-structures-and-algorithms/README.md
+++ b/notes/data-structures-and-algorithms/README.md
@@ -1,8 +1,10 @@
-

-
# 数据结构与算法
-## 学习路径
+> 欢迎来到数据结构与算法的世界,带你从基础的数据结构入手层层深入
+
+
+
+## 学习目录
| 部分 | 章节 | 概要 |
| :--- | :--------------------------- | :--------------------------------------------------- |
@@ -10,22 +12,40 @@
| Ⅱ | [算法思想](算法思想.md) | 排序算法、动态规划、递归、回溯法、贪心算法等经典算法 |
| Ⅲ | [LeetCode 题解](LeetCode.md) | LeetCode 热题 HOT 100 |
+
-
-## 参考资料
+## 在线刷题
- 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台
+
https://leetcode-cn.com/problemset/all
+- 牛客网-找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网
+
+ https://www.nowcoder.com/
+
+
+
+## 在线工具
+
+- VisuAlgo - visualising data structures and algorithms through animation
+
+ https://visualgo.net/en
+
+- Data Structure Visualization
+
+ https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
+
## 学习课程
-| 课程 | 推荐 |
-| ------------------------------------------------------------ | ----------------------------------------- |
-| [【慕课网】刘宇波:玩转数据结构,从入门到进阶](https://coding.imooc.com/class/207.html) | 数据结构从底层到实现,浅显易懂 |
-| [【慕课网】刘宇波:程序员的内功修炼,学好算法与数据结构](https://coding.imooc.com/class/71.html) | 程序员的内功修炼,强烈推荐 |
-| [【慕课网】刘宇波:玩转算法面试 leetcode题库分门别类详细解析](https://coding.imooc.com/class/82.html) | LeetCode 刷题入门,强烈推荐 |
-| [【极客时间】覃超:算法面试通关40讲](https://time.geekbang.org/course/intro/130) | 市面上比较新的课程,推荐 |
-| [【慕课网】刘宇波:看得见的算法 7个经典应用诠释算法精髓](https://coding.imooc.com/class/138.html) | 通过7款经典好玩游戏,真正将算法用于实际开 |
+| 课程 | 链接 | 代码 | 推荐 |
+| ------------------------------------------------------ | ------------------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------- |
+| 【慕课网】玩转数据结构 从入门到进阶(Java) | [官网](https://coding.imooc.com/class/chapter/207.html) | [代码](https://github.com/liuyubobobo/Play‑with‑Data‑Structures) | 数据结构从底层到实现,浅显易懂 |
+| 【慕课网】算法与数据结构体系课(Java)
| [官网](https://class.imooc.com/datastructure#Anchor) | [代码](https://github.com/frank‑lam/Algorithm) | 《玩转数据结构 从入门到进阶》 - 升级版 |
+| 【慕课网】程序员的内功修炼,学好算法与数据结构(C++) | [官网](https://coding.imooc.com/class/chapter/71.html) | [代码](https://github.com/liuyubobobo/Play‑with‑Algorithms) | 程序员的内功修炼,强烈推荐 |
+| 【慕课网】玩转算法面试 leetcode 题库(C++) | [官网](https://coding.imooc.com/class/chapter/82.html) | [代码](https://github.com/liuyubobobo/Play‑with‑Algorithm‑Interview) | LeetCode 刷题入门,强烈推荐 |
+| 【极客时间】覃超:算法面试通关40讲 | [官网](https://time.geekbang.org/course/intro/130) | / | 市面上比较新的课程,推荐 |
+| 【慕课网】刘宇波:看得见的算法 7个经典应用诠释算法精髓 | 官网 | / | 通过7款经典好玩游戏,真正将算法用于实际开 |
From 0d658bd97237779de83f84531a110c0e683ed365 Mon Sep 17 00:00:00 2001
From: FrankFeekr <1002039945@qq.com>
Date: Wed, 11 Aug 2021 18:44:54 +0800
Subject: [PATCH 02/10] no message
---
notes/data-structures-and-algorithms/README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/notes/data-structures-and-algorithms/README.md b/notes/data-structures-and-algorithms/README.md
index 3fb34e6..408b2ef 100644
--- a/notes/data-structures-and-algorithms/README.md
+++ b/notes/data-structures-and-algorithms/README.md
@@ -1,6 +1,6 @@
# 数据结构与算法
-> 欢迎来到数据结构与算法的世界,带你从基础的数据结构入手层层深入
+> 欢迎来到数据结构与算法的世界,带你从基础数据结构层层深入。本章以 Java 代码为例,结合 LeetCode 题解示例进行数据结构学习。
@@ -47,5 +47,5 @@
| 【慕课网】程序员的内功修炼,学好算法与数据结构(C++) | [官网](https://coding.imooc.com/class/chapter/71.html) | [代码](https://github.com/liuyubobobo/Play‑with‑Algorithms) | 程序员的内功修炼,强烈推荐 |
| 【慕课网】玩转算法面试 leetcode 题库(C++) | [官网](https://coding.imooc.com/class/chapter/82.html) | [代码](https://github.com/liuyubobobo/Play‑with‑Algorithm‑Interview) | LeetCode 刷题入门,强烈推荐 |
| 【极客时间】覃超:算法面试通关40讲 | [官网](https://time.geekbang.org/course/intro/130) | / | 市面上比较新的课程,推荐 |
-| 【慕课网】刘宇波:看得见的算法 7个经典应用诠释算法精髓 | 官网 | / | 通过7款经典好玩游戏,真正将算法用于实际开 |
+| 【慕课网】刘宇波:看得见的算法 7个经典应用诠释算法精髓 | [官网](https://coding.imooc.com/class/chapter/138.html) | / | 通过7款经典好玩游戏,真正将算法用于实际开 |
From d091be737726dd7e4ea19380cdf122d74f9e1b63 Mon Sep 17 00:00:00 2001
From: FrankFeekr <1002039945@qq.com>
Date: Wed, 11 Aug 2021 22:03:18 +0800
Subject: [PATCH 03/10] no message
---
...60\346\215\256\347\273\223\346\236\204.md" | 42 +
...27\346\263\225\346\200\235\346\203\263.md" | 728 ++++++++++++++++++
2 files changed, 770 insertions(+)
diff --git "a/notes/data-structures-and-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md" "b/notes/data-structures-and-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md"
index e69de29..387efef 100644
--- "a/notes/data-structures-and-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md"
+++ "b/notes/data-structures-and-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md"
@@ -0,0 +1,42 @@
+- 字符串
+
+ - 标准库,解析,匹配等
+
+- 线性表
+
+ - 数组
+
+ - 动态数组
+
+- 链表
+
+- 栈和队列
+
+- 哈希表
+
+- 树结构
+
+ - 二叉树
+
+ - 二分搜索树
+ - 二叉树具有天然的递归结构
+
+ - 优先队列和堆
+
+ - 平衡二叉树
+
+ - AVL 树
+
+ - 红黑树
+
+ - 并查集
+
+ - 线段树
+
+ - Trie(字典树,前缀树)
+
+ - B 和 B+
+
+- 集合和映射
+
+ - Set / Map
\ No newline at end of file
diff --git "a/notes/data-structures-and-algorithms/\347\256\227\346\263\225\346\200\235\346\203\263.md" "b/notes/data-structures-and-algorithms/\347\256\227\346\263\225\346\200\235\346\203\263.md"
index 75410cf..28a3493 100644
--- "a/notes/data-structures-and-algorithms/\347\256\227\346\263\225\346\200\235\346\203\263.md"
+++ "b/notes/data-structures-and-algorithms/\347\256\227\346\263\225\346\200\235\346\203\263.md"
@@ -1,2 +1,730 @@
# 算法思想
+## 一、排序算法
+
+### 1. 选择排序(Selection Sort)
+
+选择出数组中的最小元素,将它与数组的第一个元素交换位置。再从剩下的元素中选择出最小的元素,将它与数组的第二个元素交换位置。不断进行这样的操作,直到将整个数组排序。
+
+
+
+**代码实现**
+
+```java
+public static void sort(int[] arr) {
+ for (int i = 0; i < arr.length; i++) {
+ // 寻找[i, n)区间里的最小值的索引
+ int minIndex = i;
+ for (int j = i + 1; j < arr.length; j++) {
+ if(arr[minIndex] > arr[j]){
+ minIndex = j;
+ }
+ }
+ swap( arr , i , minIndex);
+ }
+}
+
+private static void swap(int[] arr, int i, int j) {
+ int t = arr[i];
+ arr[i] = arr[j];
+ arr[j] = t;
+}
+```
+
+**算法分析**
+
+表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。理论上讲,选择排序可能也是平时排序一般人想到的最多的排序方法了吧。
+
+
+
+### 2. 插入排序(Insertion Sort)
+
+插入排序从左到右进行,每次都将当前元素插入到左侧已经排序的数组中,使得插入之后左部数组依然有序。
+
+第 j 元素是通过不断向左比较并交换来实现插入过程:当第 j 元素小于第 j - 1 元素,就将它们的位置交换,然后令 j 指针向左移动一个位置,不断进行以上操作。
+
+
+
+**代码实现**
+
+```java
+public static void sort(int[] arr) {
+ for (int i = 0; i < arr.length; i++) {
+ // 选择 arr[i...n) 中的最小值
+ int minIndex = i;
+ for (int j = i + 1; j < arr.length; j++) {
+ if (arr[minIndex] > arr[j]) {
+ minIndex = j;
+ }
+ }
+ swap(arr, i, minIndex);
+ }
+}
+
+// 改进版插入排序(减少了数组元素的操作次数)
+public static void better_sort(int[] arr) {
+ for (int i = 0; i < arr.length; i++) {
+ int e = arr[i];
+ int j = i;
+ for (; j > 0; j--) {
+ if (e < arr[j - 1])
+ arr[j] = arr[j - 1];
+ else
+ break;
+ }
+ arr[j] = e;
+ }
+}
+
+private static void swap(int[] arr, int i, int j) {
+ int t = arr[i];
+ arr[i] = arr[j];
+ arr[j] = t;
+}
+```
+
+**算法分析**
+
+插入排序在实现上,通常采用 in-place 排序(即只需用到 O(1) 的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
+
+
+
+### 3. 冒泡排序(Bubble Sort)
+
+通过从左到右不断交换相邻逆序的相邻元素,在一轮的交换之后,可以让未排序的元素上浮到右侧。
+
+在一轮循环中,如果没有发生交换,就说明数组已经是有序的,此时可以直接退出。
+
+
+
+**代码实现**
+
+```java
+private static void sort(int[] arr) {
+ for (int i = arr.length - 1; i > 0; i--) { // 从最后一位开始确定
+ boolean swapped = false;
+ for (int j = 0; j < i; j++) {
+ if(arr[j] > arr[j+1]){
+ swapped = true;
+ swap(arr,j,j+1);
+ }
+ }
+ if(!swapped)
+ return;
+ }
+}
+
+private static void swap(int[] arr, int i, int j) {
+ int t = arr[i];
+ arr[i] = arr[j];
+ arr[j] = t;
+}
+```
+
+
+
+### 4. 希尔排序(Shell Sort)
+
+1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫**缩小增量排序**。
+
+
+
+**算法描述**
+
+先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:
+
+- 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
+- 按增量序列个数k,对序列进行k 趟排序;
+- 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
+
+
+
+**代码实现**
+
+```java
+// 希尔排序
+public static void sort(int[] arr) {
+ int n = arr.length;
+ for (int h = n / 2; h > 0; h = h / 2) {
+ // 内部是一个插入排序
+ for (int i = 0; i < n; i = i + h) {
+
+ int e = arr[i];
+ int j = i;
+ for (; j > 0; j = j - h) {
+ if (e < arr[j - h])
+ arr[j] = arr[j - h];
+ else
+ break;
+ }
+ arr[j] = e;
+ }
+ }
+}
+
+
+// 希尔排序2
+public static void sort2(int[] arr) {
+ int n = arr.length;
+ // 计算 increment sequence: 1, 4, 13, 40, 121, 364, 1093...
+ int h = 1;
+ while (h < n / 3) h = 3 * h + 1;
+
+ System.out.println(h);
+
+ while (h >= 1) {
+ // h-sort the array
+ for (int i = h; i < n; i++) {
+
+ // 对 arr[i], arr[i-h], arr[i-2*h], arr[i-3*h]... 使用插入排序
+ int e = arr[i];
+ int j = i;
+ for (; j >= h && e < arr[j - h]; j -= h)
+ arr[j] = arr[j - h];
+ arr[j] = e;
+ }
+
+ h /= 3;
+ }
+}
+```
+
+**算法分析**
+
+对于大规模的数组,插入排序很慢,因为它只能交换相邻的元素,每次只能将逆序数量减少 1。
+
+希尔排序的出现就是为了改进插入排序的这种局限性,它通过交换不相邻的元素,每次可以将逆序数量减少大于 1。
+
+希尔排序使用插入排序对间隔 h 的序列进行排序。通过不断减小 h,最后令 h=1,就可以使得整个数组是有序的。
+
+
+
+### 5. 归并排序(Merge Sort)
+
+归并排序的思想是将数组分成两部分,分别进行排序,然后归并起来。把长度为n的输入序列分成两个长度为n/2的子序列;对这两个子序列分别采用归并排序;将两个排序好的子序列合并成一个最终的排序序列。
+
+
+
+**代码实现**
+
+> 1.归并方法
+>
+> 归并方法将数组中两个已经排序的部分归并成一个。
+
+```java
+private static void sort(int[] arr) {
+ __MergeSort(arr, 0, arr.length - 1);
+}
+
+private static void __MergeSort(int[] arr, int l, int r) {
+ if (l >= r)
+ return;
+ int mid = (l + r) / 2;
+ __MergeSort(arr, l, mid);
+ __MergeSort(arr, mid + 1, r);
+ merge(arr, l, mid, r);
+}
+
+// 将arr[l...mid]和arr[mid+1...r]两部分进行归并
+private static void merge(int[] arr, int l, int mid, int r) {
+ int[] aux = Arrays.copyOfRange(arr, l, r + 1);
+
+ // 初始化,i指向左半部分的起始索引位置l;j指向右半部分起始索引位置mid+1
+ int i = l, j = mid + 1;
+ for (int k = l; k <= r; k++) {
+ if (i > mid) { // 如果左半部分元素已经全部处理完毕
+ arr[k] = aux[j - l];
+ j++;
+ } else if (j > r) { // 如果右半部分元素已经全部处理完毕
+ arr[k] = aux[i - l];
+ i++;
+ } else if (aux[i - l] < aux[j - l]) { // 左半部分所指元素 < 右半部分所指元素
+ arr[k] = aux[i - l];
+ i++;
+ } else { // 左半部分所指元素 >= 右半部分所指元素
+ arr[k] = aux[j - l];
+ j++;
+ }
+ }
+}
+```
+
+> 2.自底向上归并排序
+
+```java
+private static void sort(int[] arr) {
+ int N = arr.length;
+ int[] aux = new int[N];
+ for (int sz = 1; sz < N; sz += sz)
+ for (int i = 0; i + sz < N; i += sz + sz)
+ merge(arr, i, i + sz - 1, Math.min(i + sz + sz - 1, N - 1));
+}
+```
+
+
+
+### 6. 快速排序(Quick Sort)
+
+快速排序可以说是20世纪最伟大的算法之一了。相信都有所耳闻,它的速度也正如它的名字那样,是一个非常快的算法了。当然它也后期经过了不断的改进和优化,才被公认为是一个值得信任的非常优秀的算法。
+
+
+
+**代码实现**
+
+#### 1. 普通快速排序
+
+```java
+// 递归使用快速排序,对arr[l...r]的范围进行排序
+public static void QuickSort(int[] arr,int l,int r){
+ if(l>=r)
+ return;
+ int p = partition(arr,l,r);
+ QuickSort(arr,l,p-1);
+ QuickSort(arr,p+1,r);
+}
+
+// 将数组通过p分割成两部分
+// 对arr[l...r]部分进行partition操作
+// 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
+public static int partition(int[] arr, int l, int r) {
+ swap(arr, l, (int) (Math.random() % (r - l + 1)) + l); // 加入这一行变成随机快速排序
+
+ int v = arr[l];
+ int j = l;
+ for(int i = j +1;i<=r;i++){
+ if(arr[i] < v){
+ j++;
+ swap(arr,i,j);
+ }
+ }
+ swap(arr,l,j);
+ return j;
+}
+
+public static void swap(int[] arr,int i,int j) {
+ int temp = arr[i];
+ arr[i] = arr[j];
+ arr[j] = temp;
+}
+```
+
+快速排序是原地排序,不需要辅助数组,但是递归调用需要辅助栈。
+
+快速排序最好的情况下是每次都正好能将数组对半分,这样递归调用次数才是最少的。这种情况下比较次数为 CN=2CN/2+N,复杂度为 O(NlogN)。
+
+最坏的情况下,第一次从最小的元素切分,第二次从第二小的元素切分,如此这般。因此最坏的情况下需要比较 N2/2。为了防止数组最开始就是有序的,在进行快速排序时需要随机打乱数组。
+
+
+
+#### 2. 双路快速排序
+
+若果数组中含有大量重复的元素,则partition很可能把数组划分成两个及其不平衡的两部分,时间复杂度退化成O(n²)。这时候应该把小于v和大于v放在数组两端。
+
+
+
+```java
+// 双路快速排序的partition
+// 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
+private static int partition(int[] arr, int l, int r) {
+
+ // 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot
+ // swap(arr, l, (int) (Math.random() % (r - l + 1)) + l);
+
+ int v = arr[l];
+
+ // arr[l+1...i) <= v; arr(j...r] >= v
+ int i = l + 1, j = r;
+ while (true) {
+ // 注意这里的边界, arr[i].compareTo(v) < 0, 不能是arr[i].compareTo(v) <= 0
+ // 思考一下为什么?
+ while (i <= r && arr[i] < v)
+ i++;
+
+ // 注意这里的边界, arr[j].compareTo(v) > 0, 不能是arr[j].compareTo(v) >= 0
+ // 思考一下为什么?
+ while (j >= l + 1 && arr[j] > v)
+ j--;
+
+ // 对于上面的两个边界的设定, 有的同学在课程的问答区有很好的回答:)
+ // 大家可以参考: http://coding.imooc.com/learn/questiondetail/4920.html
+ if (i > j)
+ break;
+
+ swap(arr, i, j);
+ i++;
+ j--;
+ }
+
+ swap(arr, l, j);
+
+ return j;
+}
+
+// 递归使用快速排序,对arr[l...r]的范围进行排序
+private static void QuickSort2Ways(int[] arr, int l, int r) {
+ // 对于小规模数组, 使用插入排序
+ if (l >= r) return;
+ int p = partition(arr, l, r);
+ QuickSort2Ways(arr, l, p - 1);
+ QuickSort2Ways(arr, p + 1, r);
+}
+```
+
+#### 3. 三路快速排序
+
+数组分成三个部分,大于v 等于v 小于v
+
+在具有大量重复键值对的情况下使用三路快排
+
+
+
+
+
+```java
+// 递归使用快速排序,对arr[l...r]的范围进行排序
+private static void QuickSort3Ways(int[] arr, int l, int r){
+
+ // 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot
+ swap( arr, l, (int)(Math.random()*(r-l+1)) + l );
+
+ int v = arr[l];
+
+ int lt = l; // arr[l+1...lt] < v
+ int gt = r + 1; // arr[gt...r] > v
+ int i = l+1; // arr[lt+1...i) == v
+ while( i < gt ){
+ if( arr[i] < v){
+ swap( arr, i, lt+1);
+ i ++;
+ lt ++;
+ }
+ else if( arr[i] > v ){
+ swap( arr, i, gt-1);
+ gt --;
+ }
+ else{ // arr[i] == v
+ i ++;
+ }
+ }
+ swap( arr, l, lt );
+
+ QuickSort3Ways(arr, l, lt-1);
+ QuickSort3Ways(arr, gt, r);
+}
+```
+
+
+
+### 7. 堆排序(Heap Sort)
+
+#### 1. 堆
+
+堆的某个节点的值总是大于等于子节点的值,并且堆是一颗完全二叉树。
+
+堆可以用数组来表示,因为堆是完全二叉树,而完全二叉树很容易就存储在数组中。位置 k 的节点的父节点位置为 k/2,而它的两个子节点的位置分别为 2k 和 2k+1。这里不使用数组索引为 0 的位置,是为了更清晰地描述节点的位置关系。
+
+
+
+#### 2. 上浮和下沉
+
+在堆中,当一个节点比父节点大,那么需要交换这个两个节点。交换后还可能比它新的父节点大,因此需要不断地进行比较和交换操作,把这种操作称为**上浮(ShiftUp)**。
+
+
+
+```java
+private void shiftUp(int k){
+ while( k > 1 && data[k/2] < data[k])){
+ swap(k, k/2);
+ k /= 2;
+ }
+}
+```
+
+
+
+类似地,当一个节点比子节点来得小,也需要不断地向下进行比较和交换操作,把这种操作称为**下沉(Shift Down)**。一个节点如果有两个子节点,应当与两个子节点中最大那么节点进行交换。
+
+
+
+```java
+private void shiftDown(int k){
+ while( 2*k <= count ){ // 当前结点有左孩子
+ int j = 2*k; // 在此轮循环中,data[k]和data[j]交换位置
+ if( j+1 <= count && data[j+1] > data[j] )
+ j ++;
+ // data[j] 是 data[2*k]和data[2*k+1]中的最大值
+
+ if( data[k] >= data[j] )
+ break;
+ swap(k, j);
+ k = j;
+ }
+}
+```
+
+#### 3.插入元素
+
+将新元素放到数组末尾,然后上浮到合适的位置。
+
+```java
+// 向最大堆中插入一个新的元素 item
+public void insert(Item item){
+ assert count + 1 <= capacity;
+ data[count+1] = item;
+ count ++;
+ shiftUp(count);
+}
+```
+
+#### 4. 删除最大元素
+
+```java
+// 从最大堆中取出堆顶元素, 即堆中所存储的最大数据
+public Item extractMax(){
+ assert count > 0;
+ Item ret = data[1];
+
+ swap( 1 , count );
+ count --;
+ shiftDown(1);
+ return ret;
+}
+```
+
+#### 5. 堆排序
+
+由于堆可以很容易得到最大的元素并删除它,不断地进行这种操作可以得到一个递减序列。如果把最大元素和当前堆中数组的最后一个元素交换位置,并且不删除它,那么就可以得到一个从尾到头的递减序列,从正向来看就是一个递增序列。因此很容易使用堆来进行排序。并且堆排序是原地排序,不占用额外空间。
+
+```java
+// 不使用一个额外的最大堆, 直接在原数组上进行原地的堆排序
+public class HeapSort {
+
+ // 对整个arr数组使用HeapSort1排序
+ // HeapSort1, 将所有的元素依次添加到堆中, 在将所有元素从堆中依次取出来, 即完成了排序
+ // 无论是创建堆的过程, 还是从堆中依次取出元素的过程, 时间复杂度均为O(nlogn)
+ // 整个堆排序的整体时间复杂度为O(nlogn)
+ public static void sort1(Comparable[] arr){
+
+ int n = arr.length;
+ MaxHeap maxHeap = new MaxHeap(n);
+ for( int i = 0 ; i < n ; i ++ )
+ maxHeap.insert(arr[i]);
+
+ for( int i = n-1 ; i >= 0 ; i -- )
+ arr[i] = maxHeap.extractMax();
+ }
+
+
+ // 只通过shiftDown操作进行排序
+ public static void sort2(Comparable[] arr){
+ int n = arr.length;
+
+ // 注意,此时我们的堆是从0开始索引的
+ // 从(最后一个元素的索引-1)/2开始
+ // 最后一个元素的索引 = n-1
+ for( int i = (n-1-1)/2 ; i >= 0 ; i -- )
+ shiftDown2(arr, n, i);
+
+ for( int i = n-1; i > 0 ; i-- ){ // 这个的目的是让序列从小到大排序
+ swap( arr, 0, i);
+ shiftDown2(arr, i, 0);
+ }
+ }
+
+ // 交换堆中索引为i和j的两个元素
+ private static void swap(Object[] arr, int i, int j){
+ Object t = arr[i];
+ arr[i] = arr[j];
+ arr[j] = t;
+ }
+
+ // 原始的shiftDown过程
+ private static void shiftDown(Comparable[] arr, int n, int k){
+ while( 2*k+1 < n ){
+ int j = 2*k+1;
+ if( j+1 < n && arr[j+1].compareTo(arr[j]) > 0 )
+ j += 1;
+
+ if( arr[k].compareTo(arr[j]) >= 0 )break;
+
+ swap( arr, k, j);
+ k = j;
+ }
+ }
+
+ // 优化的shiftDown过程, 使用赋值的方式取代不断的swap,
+ // 该优化思想和我们之前对插入排序进行优化的思路是一致的
+ private static void shiftDown2(Comparable[] arr, int n, int k){
+
+ Comparable e = arr[k];
+ while( 2*k+1 < n ){
+ int j = 2*k+1;
+ if( j+1 < n && arr[j+1].compareTo(arr[j]) > 0 )
+ j += 1;
+
+ if( e.compareTo(arr[j]) >= 0 )
+ break;
+
+ arr[k] = arr[j];
+ k = j;
+ }
+
+ arr[k] = e;
+ }
+
+ // 测试 HeapSort
+ public static void main(String[] args) {
+ Integer[] arr = {10, 91, 8, 7, 6, 5, 4, 3, 2, 1};
+ HeapSort.sort2(arr);
+ PrintHelper.printArray(arr);
+ }
+}
+```
+
+#### 6. 堆排序的应用——Top K问题
+
+例如,有1亿个浮点数,如何找出其中最大的10000个?(B326)
+
+
+
+### 8. 计数排序
+
+https://www.cnblogs.com/freedom314/p/5847092.html
+
+
+
+### 9. 排序算法总结
+
+| | 平均时间复杂度 | 原地排序 | 额外空间 | 稳定排序 |
+| :------: | :------------: | :------: | :------: | :------: |
+| 插入排序 | O(n^2) | √ | O(1) | √ |
+| 归并排序 | O(nlogn) | × | O(n) | √ |
+| 快速排序 | O(nlogn) | √ | O(logn) | × |
+| 堆排序 | O(nlogn) | √ | O(1) | × |
+
+稳定排序:对于相等的元素,在排序后,原来靠前的元素依然靠前。相等元素的相对位置没有发生变化。
+
+```java
+// 可以通过⾃自定义⽐比较函数,让排序算法不不存在稳定性的问题。
+bool operator<(const Student& otherStudent){
+ return score != otherStudent.score ?
+ score > otherStudent.score :
+ name < otherStudent.name;
+}
+```
+
+
+
+
+
+
+
+
+
+
+
+## 二、二分查找法
+
+Leetcode 704.
+
+
+
+
+
+## 三、递归和回溯法
+
+- Leetcode 70.
+
+- Leetcode 17.
+
+
+
+## 四、分治的思想
+
+
+
+
+
+## 五、动态规划
+
+- 9-1 什么是动态规划 (20:27)
+
+- 9-2 第一个动态规划问题 Climbing Stairs (14:02)
+
+ - [70. 爬楼梯](https://leetcode-cn.com/problems/climbing-stairs/)
+
+ - 【作业】[120. 三角形最小路径和](https://leetcode-cn.com/problems/triangle/)
+
+ - 【作业】[64. 最小路径和](https://leetcode-cn.com/problems/minimum-path-sum/)
+
+- 9-3 发现重叠子问题 Integer Break (25:10)
+
+ - [343. 整数拆分](https://leetcode-cn.com/problems/integer-break/)
+
+ - 【作业】279
+
+ - 【作业】91
+
+ - 【作业】62
+
+ - 【作业】63
+
+- 9-4 状态的定义和状态转移 House Robber (27:19)
+
+ - [198. 打家劫舍](https://leetcode-cn.com/problems/house-robber/)
+
+ - 【作业】213
+
+ - 【作业】337
+
+ - 【作业】309
+
+- 9-5 0-1背包问题 (32:37)
+
+- 9-6 0-1背包问题的优化和变种 (20:18)
+
+- 9-7 面试中的0-1背包问题 Partition Equal Subset Sum (27:34)
+
+- 9-8 LIS问题 Longest Increasing Subsequence (25:12)
+
+ - [300. 最长递增子序列](https://leetcode-cn.com/problems/longest-increasing-subsequence/)
+
+ - 【作业】[376. 摆动序列](https://leetcode-cn.com/problems/wiggle-subsequence/)
+
+- 9-9 LCS,最短路,求动态规划的具体解以及更多 (21:00)
+ - [1143. 最长公共子序列](https://leetcode-cn.com/problems/longest-common-subsequence/)
+
+- 9-10 动态规划的经典问题
+
+- https://www.cxyzjd.com/article/qq_42874319/115740445
+
+-
+
+## 六、贪心算法 08/10
+
+- 10-1 贪心基础 Assign Cookies (12:12)
+
+ - [455. 分发饼干](https://leetcode-cn.com/problems/assign-cookies/)
+
+ - 【作业】[392. 判断子序列](https://leetcode-cn.com/problems/is-subsequence/)
+
+- 10-2 贪心算法与动态规划的关系 Non-overlapping Intervals (17:58)
+ - [435. 无重叠区间](https://leetcode-cn.com/problems/non-overlapping-intervals/)
+
+- 10-3 贪心选择性质的证明 (15:19)
+
+
+
+## 七、模式匹配
+
+- KMP
+
+- RK
+
+
+
+## 八、搜索算法(深搜,广搜等)
+
+
+
+## 九、并查集
From 45288f38a8c7ca2b42c472c2b0e4b379ed4f0134 Mon Sep 17 00:00:00 2001
From: Frank <1002039945@qq.com>
Date: Sat, 14 Aug 2021 00:28:36 +0800
Subject: [PATCH 04/10] update
---
README.md | 7 +++
.../data-structures-and-algorithms/README.md | 8 +++-
...60\346\215\256\347\273\223\346\236\204.md" | 48 +++++++++++++++++++
3 files changed, 61 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index d9720a7..88d7a93 100644
--- a/README.md
+++ b/README.md
@@ -22,6 +22,13 @@
+🔥🔥🔥
+
+欢迎光临 LinTools 开发者的在线导航: https://tools.frankfeekr.cn
+
+如果你有更好的在线工具,[请点击留言](https://github.com/frank-lam/fullstack-tutorial/issues/65),持续更新!
+
+
## 前言
diff --git a/notes/data-structures-and-algorithms/README.md b/notes/data-structures-and-algorithms/README.md
index 63d36e7..9594b65 100644
--- a/notes/data-structures-and-algorithms/README.md
+++ b/notes/data-structures-and-algorithms/README.md
@@ -1,5 +1,3 @@
-
-
# 数据结构与算法
## 学习路径
@@ -12,6 +10,12 @@
+## 思维导图
+
+https://qe22azoqym.feishu.cn/mindnotes/bmncnEkHNqhGBDapbcrV3cQ4duc
+
+
+
## 参考资料
- 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台
diff --git "a/notes/data-structures-and-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md" "b/notes/data-structures-and-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md"
index e69de29..dc5b8b4 100644
--- "a/notes/data-structures-and-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md"
+++ "b/notes/data-structures-and-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md"
@@ -0,0 +1,48 @@
+# 数据结构
+
+## 一、基础数据结构
+
+### 字符串
+
+- 标准库,解析,匹配等
+
+### 线性表
+
+- 数组
+
+- 动态数组
+
+### 栈和队列
+
+### 链表
+
+### 哈希表
+
+
+
+## 二、高级数据结构
+
+### 树和二叉树
+
+- 二叉树
+
+- 二分搜索树
+
+- AVL 树
+
+- B 和 B+
+
+- 二分查找法
+ - Leetcode 704.
+
+- 红黑树
+
+### 集合和映射
+
+### 优先队列和堆
+
+### 线段树
+
+### Trie
+
+### 并查集
\ No newline at end of file
From c7929ac8af1d1eac0e7e5682c3678d19551beb2b Mon Sep 17 00:00:00 2001
From: Frank <1002039945@qq.com>
Date: Sat, 21 Aug 2021 16:58:43 +0800
Subject: [PATCH 05/10] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=95=B0=E6=8D=AE?=
=?UTF-8?q?=E7=BB=93=E6=9E=84=E9=83=A8=E5=88=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../data-structures-and-algorithms/README.md | 2 +-
.../assets/image-20210821164803357.png | Bin 0 -> 57251 bytes
.../assets/image-20210821164814332.png | Bin 0 -> 57251 bytes
.../assets/image-20210821164819266.png | Bin 0 -> 57251 bytes
...04\345\217\257\344\277\256\346\224\271.md" | 211 ++++++++++++++++
...60\346\215\256\347\273\223\346\236\204.md" | 229 +++++++++++++++++-
6 files changed, 439 insertions(+), 3 deletions(-)
create mode 100644 notes/data-structures-and-algorithms/assets/image-20210821164803357.png
create mode 100644 notes/data-structures-and-algorithms/assets/image-20210821164814332.png
create mode 100644 notes/data-structures-and-algorithms/assets/image-20210821164819266.png
create mode 100644 "notes/data-structures-and-algorithms/leetcode/Leetcode 307. \345\214\272\345\237\237\345\222\214\346\243\200\347\264\242 - \346\225\260\347\273\204\345\217\257\344\277\256\346\224\271.md"
diff --git a/notes/data-structures-and-algorithms/README.md b/notes/data-structures-and-algorithms/README.md
index 3bcb6e7..e824a53 100644
--- a/notes/data-structures-and-algorithms/README.md
+++ b/notes/data-structures-and-algorithms/README.md
@@ -20,7 +20,7 @@
https://leetcode-cn.com/problemset/all
-- 牛客网-找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网
+- 牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决
https://www.nowcoder.com/
diff --git a/notes/data-structures-and-algorithms/assets/image-20210821164803357.png b/notes/data-structures-and-algorithms/assets/image-20210821164803357.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b18aee3b5bb258af6c6d4cef7996252857d7f00
GIT binary patch
literal 57251
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