漫画:什么是 “锦标赛排序” ?

漫画:什么是 “锦标赛排序” ?_第1张图片

漫画:什么是 “锦标赛排序” ?_第2张图片

—————  第二天  —————

漫画:什么是 “锦标赛排序” ?_第3张图片

漫画:什么是 “锦标赛排序” ?_第4张图片

漫画:什么是 “锦标赛排序” ?_第5张图片

漫画:什么是 “锦标赛排序” ?_第6张图片

漫画:什么是 “锦标赛排序” ?_第7张图片

漫画:什么是 “锦标赛排序” ?_第8张图片

漫画:什么是 “锦标赛排序” ?_第9张图片

漫画:什么是 “锦标赛排序” ?_第10张图片

————————————

漫画:什么是 “锦标赛排序” ?_第11张图片

漫画:什么是 “锦标赛排序” ?_第12张图片

漫画:什么是 “锦标赛排序” ?_第13张图片

漫画:什么是 “锦标赛排序” ?_第14张图片

漫画:什么是 “锦标赛排序” ?_第15张图片

漫画:什么是 “锦标赛排序” ?_第16张图片

漫画:什么是 “锦标赛排序” ?_第17张图片

漫画:什么是 “锦标赛排序” ?_第18张图片

漫画:什么是 “锦标赛排序” ?_第19张图片

漫画:什么是 “锦标赛排序” ?_第20张图片

漫画:什么是 “锦标赛排序” ?_第21张图片

漫画:什么是 “锦标赛排序” ?_第22张图片

漫画:什么是 “锦标赛排序” ?_第23张图片

漫画:什么是 “锦标赛排序” ?_第24张图片

漫画:什么是 “锦标赛排序” ?_第25张图片

漫画:什么是 “锦标赛排序” ?_第26张图片

如图中所示,我们把原本的冠军选手5排除掉,在四分之一决赛和他同一组的选手6就自然获得了直接晋级。

接下来的半决赛,选手7打败选手6晋级;在总决赛,选手7打败选手3晋级,成为了新的冠军。

因此我们可以判断出,选手7是总体上的亚军。

漫画:什么是 “锦标赛排序” ?_第27张图片

漫画:什么是 “锦标赛排序” ?_第28张图片

漫画:什么是 “锦标赛排序” ?_第29张图片

漫画:什么是 “锦标赛排序” ?_第30张图片

漫画:什么是 “锦标赛排序” ?_第31张图片

漫画:什么是 “锦标赛排序” ?_第32张图片

漫画:什么是 “锦标赛排序” ?_第33张图片

假如给定如下数组,要求从小到大进行升序排列:

第一步,我们根据数组建立一颗满二叉树,用于进行“锦标赛式”的多层次比较。数组元素位于二叉树的叶子结点,元素数量不足时,用空结点补齐。

漫画:什么是 “锦标赛排序” ?_第34张图片

第二步,像锦标赛那样,让相邻结点进行两两比较,把数值较小的结点“晋升“到父结点。

漫画:什么是 “锦标赛排序” ?_第35张图片

如此一来,树的根结点一定是值最小的结点,把它复制到原数组的最左侧:

漫画:什么是 “锦标赛排序” ?_第36张图片

第三步,删除原本的最小结点,也就是值为1的结点。然后针对该结点所在路径,进行重新比较和刷新。

如此一来,树的根结点换成了第二小的结点,把它复制到原数组的下一个位置:

漫画:什么是 “锦标赛排序” ?_第37张图片

第四步,删除原本第二小的结点,也就是值为2的结点。然后针对该结点所在路径,进行重新比较和刷新。

如此一来,树的根结点换成了第三小的结点,把它复制到原数组的下一个位置:

漫画:什么是 “锦标赛排序” ?_第38张图片

像这样不断删除剩余的最小结点,局部刷新二叉树,最终完成了数组的升序排列:

漫画:什么是 “锦标赛排序” ?_第39张图片

漫画:什么是 “锦标赛排序” ?_第40张图片

public class TournamentSort {

    public static void tournamentSort(int[] array) {
        Node[] tree = buildTree(array);

        for(int i=0; i 1){
            for(int i=0; i

在这段代码中,二叉树的存储方式并非传统的链式存储,而是采用数组进行存储。因此,该二叉树的每一个父结点下标,都可以由(孩子下标-1)/2 来获得。

漫画:什么是 “锦标赛排序” ?_第41张图片

漫画:什么是 “锦标赛排序” ?_第42张图片

漫画:什么是 “锦标赛排序” ?_第43张图片

漫画:什么是 “锦标赛排序” ?_第44张图片

漫画:什么是 “锦标赛排序” ?_第45张图片

漫画:什么是 “锦标赛排序” ?_第46张图片

—————END—————

喜欢本文的朋友,欢迎关注公众号 程序员小灰,收看更多精彩内容

点个[在看],是对小灰最大的支持!

你可能感兴趣的:(二叉树,twitter,数据结构,kinect,qml)