锦标赛排序和树形选择排序
锦标赛排序也叫树形选择排序,是一种按照锦标赛的思想进行选择的排序方法,该方法是在简单选择排序方法上的改进。简单选择排序,花费的时间大部分都浪费在值的比较上面,而锦标赛排序刚好用树保存了前面比较的结果,下一次比较时直接利用前面比较的结果,这样就大大减少比较的时间,从而降低了时间复杂度,由$O(n^2)$降到$O(nlogn)$,但是浪费了比较多的空间,“最大的值”也比较了多次。
大概过程如下:
首先对n个记录进行两两比较,然后优胜者之间再进行两两比较,如此重复,直至选出最小关键字的记录为止。
类似甲乙丙三队比赛,前提是有这样一种传递关系:若乙胜丙,甲胜乙,则认为甲必能胜丙。
锦标赛排序图解如下
初始序列,这么多队伍参加比赛
两两比较之,用一个完全二叉树表示,反复直到一趟比较后,选出冠军
找到了 bao
,是冠军,选出冠军的比较次数为 $ 2^2+2^1+2^0 = 2^3 -1 = n-1$,然后继续比较,把原始序列的 bao
去掉
选了 cha
,选出亚军的比较次数为 $3$,即 $log2 n$ 次。 同理,把 cha
去掉,继续两两比较
找到了 diao
,其后的 $n-2$ 个人的名次均如此产生
所以对于$n$ 个参赛选手来说,即对 $n$ 个记录进行锦标赛排序,总的关键字比较次数至多为 $(n-1)log2 n + n -1$,故时间复杂度为:$ O(nlogn)$。
此法除排序结果所需的 $n$ 个单元外,尚需 $n-1 $个辅助单元。
这个过程可用一棵有$n$个叶子结点的完全二叉树表示,根节点中的关键字即为叶子结点中的最小关键字。在输出最小关键字之后,根据关系的可传递性,欲选出次小关键字, 仅需将叶子结点中的最小关键字改为“最大值”,如$∞$,然后从该叶子结点开始,和其左(右)兄弟的关键字进行比较,修改从叶子结点到根的路径上各结点的关键字,则根结点的关键字即为次小关键字。也就是所谓的树形选择排序,这种算法的缺点在于:辅助存储空间较多、最大值进行多余的比较。
1 |
|