OSDN Git Service

refactor[bucket-sort.md]: 桶排序
author夜轮_NachtgeistW <NachtgeistW@protonmail.com>
Wed, 16 Sep 2020 12:07:04 +0000 (20:07 +0800)
committer夜轮_NachtgeistW <NachtgeistW@protonmail.com>
Wed, 16 Sep 2020 12:07:04 +0000 (20:07 +0800)
docs/basic/bucket-sort.md

index 8eb92bf..74eb164 100644 (file)
@@ -1,10 +1,35 @@
¡¶æ\8e\92åº\8fé\80\82ç\94¨äº\8eå¾\85æ\8e\92åº\8fæ\95°æ\8d®å\80¼å\9f\9fè¾\83大ä½\86å\88\86å¸\83æ¯\94è¾\83å\9d\87å\8c\80ç\9a\84æ\83\85å\86µï¼\8cæ\98¯ä¸\80个æ\9c\9fæ\9c\9bæ\97¶é\97´å¤\8dæ\9d\82度为 $O(n)$ ç\9a\84æ\8e\92åº\8fç®\97æ³\95
\9c¬é¡µé\9d¢å°\86ç®\80è¦\81ä»\8bç»\8d桶æ\8e\92åº\8f
 
-其大致思想是对值域进行分块,每块分别排序。由于每块元素不多,一般使用插入排序。如果使用稳定的内层排序,并且将元素插入桶中时不改变相对顺序,那么桶排序就是稳定的。
+## 简介
 
-如果待排序数据是随机生成的,将值域平均分成 $n$ 块的期望时间复杂度是 $O(n)$ ,证明可以参考算法导论或 [维基百科](https://en.wikipedia.org/wiki/Bucket_sort) 
+桶排序(英文:Bucket sort)是排序算法的一种,适用于待排序数据值域较大但分布比较均匀的情况
 
-C++ 代码:
+## 工作原理
+
+桶排序以下列程序进行:
+
+1. 设置一个定量的数组当作空桶;
+2. 寻访序列,并且把元素一个一个放到对应的桶中;
+3. 对每个不是空的桶进行排序;
+4. 从不是空的桶里把元素再放回原来的序列中。
+
+## 性质
+
+### 稳定性
+
+如果使用稳定的内层排序,并且将元素插入桶中时不改变相对顺序,那么桶排序就是一种稳定的排序算法。
+
+由于每块元素不多,一般使用插入排序。此时桶排序是一种稳定的排序算法。
+
+### 时间复杂度
+
+桶排序的平均时间复杂度为 $O(n + n^2/k + k)$(将值域平均分成 $n$ 块 + 排序 + 重新合并元素),当 $k\approx n$ 时为 $O(n)$。[^ref1]
+
+桶排序的最坏时间复杂度为 $O(n^2)$。
+
+## 算法实现
+
+### C++
 
 ```cpp
 const int N = 100010;
@@ -41,3 +66,6 @@ void bucket_sort() {
   }
 }
 ```
+
+## 参考资料与注释
+[^ref1]: [(英文)Bucket sort - Wikipedia](https://en.wikipedia.org/wiki/Bucket_sort#Average-case_analysis)
\ No newline at end of file