This commit is contained in:
krahets
2023-08-17 05:12:05 +08:00
parent f0826da7f6
commit 97c532b228
67 changed files with 1481 additions and 1066 deletions

View File

@@ -29,6 +29,8 @@ comments: true
=== "<7>"
![bubble_operation_step7](bubble_sort.assets/bubble_operation_step7.png)
<p align="center"> 图:利用元素交换操作模拟冒泡 </p>
## 11.3.1. &nbsp; 算法流程
设数组的长度为 $n$ ,冒泡排序的步骤为:
@@ -40,7 +42,7 @@ comments: true
![冒泡排序流程](bubble_sort.assets/bubble_sort_overview.png)
<p align="center"> Fig. 冒泡排序流程 </p>
<p align="center"> 图:冒泡排序流程 </p>
=== "Java"

View File

@@ -18,7 +18,7 @@ comments: true
![桶排序算法流程](bucket_sort.assets/bucket_sort_overview.png)
<p align="center"> Fig. 桶排序算法流程 </p>
<p align="center"> 图:桶排序算法流程 </p>
=== "Java"
@@ -411,10 +411,10 @@ comments: true
![递归划分桶](bucket_sort.assets/scatter_in_buckets_recursively.png)
<p align="center"> Fig. 递归划分桶 </p>
<p align="center"> 图:递归划分桶 </p>
如果我们提前知道商品价格的概率分布,**则可以根据数据概率分布设置每个桶的价格分界线**。值得注意的是,数据分布并不一定需要特意统计,也可以根据数据特点采用某种概率模型进行近似。如下图所示,我们假设商品价格服从正态分布,这样就可以合理地设定价格区间,从而将商品平均分配到各个桶中。
![根据概率分布划分桶](bucket_sort.assets/scatter_in_buckets_distribution.png)
<p align="center"> Fig. 根据概率分布划分桶 </p>
<p align="center"> 图:根据概率分布划分桶 </p>

View File

@@ -16,7 +16,7 @@ comments: true
![计数排序流程](counting_sort.assets/counting_sort_overview.png)
<p align="center"> Fig. 计数排序流程 </p>
<p align="center"> 图:计数排序流程 </p>
=== "Java"
@@ -362,6 +362,8 @@ $$
=== "<8>"
![counting_sort_step8](counting_sort.assets/counting_sort_step8.png)
<p align="center"> 图:计数排序步骤 </p>
计数排序的实现代码如下所示。
=== "Java"

View File

@@ -62,6 +62,8 @@ comments: true
=== "<12>"
![heap_sort_step12](heap_sort.assets/heap_sort_step12.png)
<p align="center"> 图:堆排序步骤 </p>
在代码实现中我们使用了与堆章节相同的从顶至底堆化Sift Down的函数。值得注意的是由于堆的长度会随着提取最大元素而减小因此我们需要给 Sift Down 函数添加一个长度参数 $n$ ,用于指定堆的当前有效长度。
=== "Java"

View File

@@ -12,7 +12,7 @@ comments: true
![单次插入操作](insertion_sort.assets/insertion_operation.png)
<p align="center"> Fig. 单次插入操作 </p>
<p align="center"> 图:单次插入操作 </p>
## 11.4.1. &nbsp; 算法流程
@@ -25,7 +25,7 @@ comments: true
![插入排序流程](insertion_sort.assets/insertion_sort_overview.png)
<p align="center"> Fig. 插入排序流程 </p>
<p align="center"> 图:插入排序流程 </p>
=== "Java"

View File

@@ -11,7 +11,7 @@ comments: true
![归并排序的划分与合并阶段](merge_sort.assets/merge_sort_overview.png)
<p align="center"> Fig. 归并排序的划分与合并阶段 </p>
<p align="center"> 图:归并排序的划分与合并阶段 </p>
## 11.6.1. &nbsp; 算法流程
@@ -52,6 +52,8 @@ comments: true
=== "<10>"
![merge_sort_step10](merge_sort.assets/merge_sort_step10.png)
<p align="center"> 图:归并排序步骤 </p>
观察发现,归并排序的递归顺序与二叉树的后序遍历相同,具体来看:
- **后序遍历**:先递归左子树,再递归右子树,最后处理根节点。

View File

@@ -41,6 +41,8 @@ comments: true
=== "<9>"
![pivot_division_step9](quick_sort.assets/pivot_division_step9.png)
<p align="center"> 图:哨兵划分步骤 </p>
!!! note "快速排序的分治思想"
哨兵划分的实质是将一个较长数组的排序问题简化为两个较短数组的排序问题。
@@ -366,7 +368,7 @@ comments: true
![快速排序流程](quick_sort.assets/quick_sort_overview.png)
<p align="center"> Fig. 快速排序流程 </p>
<p align="center"> 图:快速排序流程 </p>
=== "Java"

View File

@@ -18,7 +18,7 @@ comments: true
![基数排序算法流程](radix_sort.assets/radix_sort_overview.png)
<p align="center"> Fig. 基数排序算法流程 </p>
<p align="center"> 图:基数排序算法流程 </p>
下面来剖析代码实现。对于一个 $d$ 进制的数字 $x$ ,要获取其第 $k$ 位 $x_k$ ,可以使用以下计算公式:

View File

@@ -47,6 +47,8 @@ comments: true
=== "<11>"
![selection_sort_step11](selection_sort.assets/selection_sort_step11.png)
<p align="center"> 图:选择排序步骤 </p>
在代码中,我们用 $k$ 来记录未排序区间内的最小元素。
=== "Java"
@@ -290,4 +292,4 @@ comments: true
![选择排序非稳定示例](selection_sort.assets/selection_sort_instability.png)
<p align="center"> Fig. 选择排序非稳定示例 </p>
<p align="center"> 图:选择排序非稳定示例 </p>

View File

@@ -10,7 +10,7 @@ comments: true
![数据类型和判断规则示例](sorting_algorithm.assets/sorting_examples.png)
<p align="center"> Fig. 数据类型和判断规则示例 </p>
<p align="center"> 图:数据类型和判断规则示例 </p>
## 11.1.1. &nbsp; 评价维度

View File

@@ -15,7 +15,7 @@ comments: true
![排序算法对比](summary.assets/sorting_algorithms_comparison.png)
<p align="center"> Fig. 排序算法对比 </p>
<p align="center"> 图:排序算法对比 </p>
## 11.11.1. &nbsp; Q & A