OSDN Git Service

refactor[torunament-sort.md]: 锦标赛排序
author夜轮_NachtgeistW <NachtgeistW@protonmail.com>
Fri, 25 Sep 2020 16:20:39 +0000 (00:20 +0800)
committer夜轮_NachtgeistW <NachtgeistW@protonmail.com>
Fri, 25 Sep 2020 16:20:39 +0000 (00:20 +0800)
docs/basic/tournament-sort.md

index 42252cb..b2a7ebc 100644 (file)
@@ -1,21 +1,45 @@
-锦标赛排序又被称为树形选择排序,是 [选择排序](/selection-sort.md) 的优化版本,在选择排序中用 $O(n)$ 的时间来选取一个元素,而锦标赛排序用 $O(\log n)$ 的时间选取一个元素,其总时间复杂度是 $O(n\log n)$ ,需要 $O(n)$ 的辅助空间。锦标赛排序是堆排序的一种变体
+本页面将简要介绍锦标赛排序
 
-锦标赛排序算法的名字来源于一种单败淘汰制的竞赛形式,在单败淘汰制中有许多选手参与比赛,两两比较胜出的选手进入下一轮比赛。这种淘汰方式能够决定最好的选手,但是在最后一轮比赛中被淘汰的选手不一定是第二好的,他可能不如先前被淘汰的选手。
+## 简介
 
-## 算法流程
+锦标赛排序(英文:Tournament sort),又被称为树形选择排序,是 [选择排序](/selection-sort.md) 的优化版本,[堆排序](heap-sort.md) 的一种变体。它在选择排序的基础上使用优先队列查找下一个该选择的元素。
+
+该算法的名字来源于单败淘汰制的竞赛形式。在这种赛制中有许多选手参与比赛,他们两两比较,胜者进入下一轮比赛。这种淘汰方式能够决定最好的选手,但是在最后一轮比赛中被淘汰的选手不一定是第二好的——他可能不如先前被淘汰的选手。
+
+## 工作原理
+
+以 **最小锦标赛排序树** 为例。
 
 ![tournament-sort1](./images/tournament-sort1.png)
 
¦\82å\9b¾æ\89\80示ï¼\8cè¿\99æ\98¯ä¸\80棵 **æ\9c\80å°\8fé\94¦æ \87èµ\9bæ\8e\92åº\8fæ \91** ï¼\8cå¾\85æ\8e\92åº\8fæ\95°æ\8d®æ\98¯å\8f¶å­\90è\8a\82ç\82¹æ\98¾ç¤ºç\9a\84æ\95°æ\8d®ã\80\82红è\89²è¾¹æ\98¾ç¤ºç\9a\84æ\98¯æ¯\8fä¸\80è½®æ¯\94è¾\83中è¾\83å°\8fç\9a\84æ\95°æ\8d®ç\9a\84è\83\9cå\87ºè·¯å¾\84ã\80\82æ\98¾ç\84¶å®\8cæ\88\90ä¸\80次ï¼\82é\94¦æ \87èµ\9bï¼\82å\8f¯ä»¥é\80\89å\87ºä¸\80ç»\84æ\95°æ\8d®中最小的那一个。
¾\85æ\8e\92åº\8få\85\83ç´ æ\98¯å\8f¶å­\90è\8a\82ç\82¹æ\98¾ç¤ºç\9a\84å\85\83ç´ ã\80\82红è\89²è¾¹æ\98¾ç¤ºç\9a\84æ\98¯æ¯\8fä¸\80è½®æ¯\94è¾\83中è¾\83å°\8fç\9a\84å\85\83ç´ ç\9a\84è\83\9cå\87ºè·¯å¾\84ã\80\82æ\98¾ç\84¶ï¼\8cå®\8cæ\88\90ä¸\80次ï¼\82é\94¦æ \87èµ\9bï¼\82å\8f¯ä»¥é\80\89å\87ºä¸\80ç»\84å\85\83ç´ 中最小的那一个。
 
-每一轮对 $n$ 个数据进行比较并且得到 $\frac{n}{2}$ 个"优胜者",每一对中较小的数据进入下一轮比较。如果无法凑齐一对,数据那么这个数据直接进入下一轮的比较。
+每一轮对 $n$ 个元素进行比较后可以得到 $\frac{n}{2}$ 个“优胜者”,每一对中较小的元素进入下一轮比较。如果无法凑齐一对元素,那么这个元素直接进入下一轮的比较。
 
 ![tournament-sort2](./images/tournament-sort2.png)
 
-完成一次"锦标赛"后需要将被选出的那个数据去除,不妨直接将其设置为 $\infty$ ,这个操作类似我们熟悉的 [堆排序](/heap-sort.md) ,然后我们就可以再进行一次"锦标赛"选出次小的那个数据了。一直重复这个这个操作,直至所有数据有序。
+完成一次“锦标赛”后需要将被选出的元素去除。直接将其设置为 $\infty$ (这个操作类似 [堆排序](/heap-sort.md)),然后再次举行“锦标赛”选出次小的元素。
+
+之后一直重复这个操作,直至所有元素有序。
+
+## 性质
+
+### 稳定性
+
+锦标赛排序是一种不稳定的排序算法。
+
+### 时间复杂度
+
+锦标赛排序的最优时间复杂度、平均时间复杂度和最坏时间复杂度均为 $O(n\log n)$。它用 $O(n)$ 的时间初始化“锦标赛”,然后用 $O(\log n)$ 的时间从 $n$ 个元素中选取一个元素。
+
+### 空间复杂度
+
+锦标赛排序的空间复杂度为 $O(n)$。
 
 ## 代码实现
 
+### C++
+
 ```cpp
 int n, a[maxn], tmp[maxn << 1];
 
@@ -64,3 +88,7 @@ void tournament_sort() {
   }
 }
 ```
+
+## 外部链接
+
+- [Tournament sort - Wikipedia](https://en.wikipedia.org/wiki/Tournament_sort)
\ No newline at end of file