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

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

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

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

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

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

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

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

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

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

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

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

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

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

public class TournamentSort {public static void tournamentSort(int[] array) {Node[] tree = buildTree(array);for(int i=0; i<array.length; i++){array[i] = tree[0].data;if(i<array.length-1) {//当前最小元素所对应的叶子结点置空tree[tree[0].index] = null;//重新选举最小元素updateTree(tree[0].index, tree);}}}//排序前为数组构建二叉树,并选举最小值到树的根结点public static Node[] buildTree(int[] array) {//计算叶子层的结点数int leafSize = nearestPowerOfTwo(array.length);//计算二叉树的总结点数int treeSize = leafSize * 2 - 1;Node[] tree = new Node[treeSize];//填充叶子结点for(int i=0; i<array.length; i++){tree[i+leafSize-1] = new Node(i+leafSize-1, array[i]);}//自下而上填充非叶子结点int levelSize = leafSize;int lastIndex = treeSize-1;while(levelSize > 1){for(int i=0; i<levelSize; i+=2){Node right = tree[lastIndex-i];Node left = tree[lastIndex-i-1];Node parent = left;if(left != null && right != null) {parent = left.data<right.data?left:right;}else if (left == null){parent = right;}if(parent != null){int parentIndex = (lastIndex-i-1)/2;tree[parentIndex] = new Node(parent.index, parent.data);}}lastIndex -= levelSize;levelSize = levelSize/2;}return tree;}//重新选举最小元素public static void updateTree(int index, Node[] tree){while(index != 0){Node node = tree[index];Node sibling = null;if((index&1) == 1){//index为奇数,该结点是左孩子sibling = tree[index+1];}else {//index为偶数,该结点是右孩子sibling = tree[index-1];}Node parent = node;int parentIndex = (index-1)/2;if(node != null && sibling != null) {parent = node.data<sibling.data?node:sibling;}else if (node == null){parent = sibling;}tree[parentIndex] = parent==null ? null : new Node(parent.index, parent.data);index = parentIndex;}}//获得仅大于number的完全平方数public static int nearestPowerOfTwo(int number) {int square = 1;while(square < number){square = square<<1;}return square;}//结点类private static class Node {int data;int index;Node(int index, int data){this.index = index;this.data = data;}}public static void main(String[] args) {int[] array = {9,3,7,1,5,2,8,10,11,19,4};tournamentSort(array);System.out.println(Arrays.toString(array));}}

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

—————END—————

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

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

漫画:什么是 “锦标赛排序” ?相关推荐

  1. 锦标赛排序、洪水填充算法、平衡规划

    锦标赛排序 锦标赛排序(胜者树,记录胜者) 锦标赛排序(胜者树,记录胜者) - Class Xman - 博客园 锦标赛排序(胜者树,记录胜者)_继续微笑lsj-CSDN博客_锦标赛排序 数据结构之树 ...

  2. Algorithm:C++语言实现之内排序、外排序相关算法(插入排序 、锦标赛排序、归并排序)

    Algorithm:C++语言实现之内排序.外排序相关算法(插入排序 .锦标赛排序.归并排序) 目录 一.内排序 1.插入排序 2.锦标赛排序 3.归并排序 二.外排序 1.过程 一.内排序 1.插入 ...

  3. Hark的数据结构与算法练习之锦标赛排序

    算法说明 锦标赛排序是选择排序的一种. 实际上堆排序是锦标赛排序的优化版本,它们时间复杂度都是O(nlog2n),不同之处是堆排序的空间复杂度(O(1))远远低于锦标赛的空间复杂度(O(2n-1)) ...

  4. 计算机大赛算法,计算机经典算法——锦标赛排序算法

    关键词:二叉树 生活中的淘汰锦标赛:在单淘汰的锦标赛中,选手们两两比赛,胜者晋级,败者被淘汰.比如世界乒乓球锦标赛或者大满贯网球赛就是这么进行的. 这样一来,就可以把比赛的赛程和结果对应成一个二叉树. ...

  5. 树形选择排序(锦标赛排序)

    算法介绍   树形选择排序(Tree Selection Sort),又称锦标赛排序(Tournament Sort),是一种按锦标赛的思想进行选择排序的方法.简单选择排序花费的时间主要在比较上,每次 ...

  6. 漫画算法笔记 桶排序

    漫画算法笔记 桶排序 #include <iostream> #include <stdlib.h> #include <algorithm> #include & ...

  7. 漫画: 什么是外部排序?

    西天取经的路上,一样上演着编程的乐趣..... 排序的时候我们可以选择快速排序或归并排序等算法. 为了方便,我们把排序好的2G有序数据称之为有序子串吧.接着我们可以把两个小的有序子串合并成一个大的有序 ...

  8. 使用qsort对不连续的内存数据排序_数据结构教程_v20201121

    数据结构入门 1.    什么是数据结构 2.    数据结构有哪些,常用数据结构详解 3.    数据的逻辑结构和存储结构(物理结构)详解 4.    数据结构和算法的关系和区别 5.    数据结 ...

  9. 排序算法汇总(转载收藏)

    一 排序的基本概念 所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来. 其确切定义如下: 输入: n个记录R1,R2,-,Rn,其相应的关键字分别为K1,K2,-,Kn. 输出 ...

最新文章

  1. Java调用C/C++编写的第三方dll动态链接库(zz)
  2. 精选26个Python实用技巧,想秀技能先Get这份技术列表!
  3. 2021全州高中高考成绩查询,最新!最全!桂林各中学高考成绩汇总!为桂林考生骄傲!...
  4. 神经元模型及网络结构
  5. Android消息机制基本原理和使用
  6. bootstrap Table的使用方法
  7. jqgrid mvc_将JQGrid与Spring MVC和Gson集成
  8. 【渝粤教育】广东开放大学 社会工作综合能力 形成性考核 (27)
  9. eda分析_EDA理论指南
  10. 前端学习(1531):钩子函数--代码演示(面试重点)二
  11. C语言课后习题(66)
  12. 编写数据驱动的单元测试的代码
  13. mysql中int 5_mysql中int(x)与int以及varchar与char的区别_HelloWorld_ty的博客-CSDN博客
  14. Linux中文件权限(有图详细讲解)
  15. ArcGIS中使用模型构建器快速计算图斑面积占比
  16. FastAPI中Jinjia2使用
  17. 国外 2D 游戏引擎相关站点
  18. 计算机房电源引入方式,(完整版)通信机房电源计算公式.pdf
  19. 教你在 Ubuntu 安装 uTorrent
  20. 矢量、栅格、瓦片地图傻傻分不清

热门文章

  1. window7电脑调亮度
  2. 练习:LOL 英雄列表(加入弹框修改英雄名称)
  3. admob facebook广告账号被封禁 申诉不通过【吐槽,我也没解决】
  4. 果客邦水果一件代发货源平台构建“果品零级渠道”供应链新模式
  5. 提升仓储作业的效率和准确率,RFID仓储系统解决方案
  6. Mac的Windows支持软件
  7. node打包工具--Pgk
  8. Qt样式表(QSS)Demo:黑色扁平加渐变
  9. oracle建表语句空间,oracle建表空间语句
  10. 导弹工厂到摩托车间:制造业如何应用大数据