一、树形选择排序的基本思想

(1) 树形选择排序又称锦标赛排序(Tournament Sort),是一种按照锦标赛的思想进行选择排序的方法。首先对n个记录的关键字进行两两比较,然后在n/2个较小者之间再进行两两比较,如此重复,直至选出最小的记录为止。

(2) 树形选择排序(Tree Selection Sort),这个过程可用一棵有n个叶子结点的完全二叉树表示。

例如,图表中的二叉树表示从8个数中选出最小数的过程。

8个叶子结点到根接点中的关键字,每个非终端结点中的数均等于其左右孩子结点中较小的数值,则根结点中的数即为叶子结点的最小数。在输出最小数之后,割据关系的可传递性,欲选出次小数,仅需将叶子结点中的最小数(13)改为“最大值”,然后从该叶子接点开始,和其左(或右)兄弟的数值进行比较,修改从叶子结点到根的路径上各结点的数,则根结点的数值即为最小值。同理,可依次选出从小到大的所有数。

(3) 由于含有n个子结点的完全二叉树的深度为log2n+1,则在树形选择排序中,除了最小数值之外,每选择一个次小数仅需要进行log2n次比较,因此,它的时间复杂度为O(nlogn)。但是,这种排序方法尚有辅助存储空间较多、和“最大值”进行多余比较等缺点。为了弥补,威洛姆斯(J. willioms)在1964年提出了另一种形式的选择排序——堆排序。

二、算法实现

算法从叶子节点中选出最大值,逆向存储在数据队列中,形成升序排序。

 public static void treeSelectionSort(int[] data) {//长度小于2,无需排序if(data.length<2){return;}int leafCount = 1;    //满二叉树的叶子节点数,非完全二叉树叶子节点数//计算出满二叉树的叶子节点数,节点数大于等于数据队列的长度while (leafCount < data.length) {leafCount *= 2;}int[] tree = new int[leafCount * 2];  //树,tree[0]不存储数据//data里面的值赋值到树叶子节点for (int i = 0; i < data.length; i++) {tree[tree.length - i - 1] = data[i];}//初始化还没有赋值的树叶子结点,赋值叶子节点最小值for (int i = data.length; i < leafCount; i++) {tree[tree.length - i - 1] = Integer.MIN_VALUE;}//初始化,构建整棵树for (int i = tree.length - 1; i > 1; i -= 2) {tree[i / 2] = Math.max(tree[i], tree[i - 1]);}data[data.length-1] = tree[1];   //将树根节点赋值于dataint maxIndex;   //堆最大值所对应的叶子节点的下标//继续寻找剩下的最大值,逆向存储,升序排序for (int i = data.length-2; i >=0; i--) {maxIndex = tree.length - 1;  //默认堆最后一个位置//寻找树根值所在的叶子节点的位置while (tree[maxIndex] != tree[1]) {maxIndex--;}tree[maxIndex]=Integer.MIN_VALUE; //该叶子节点赋值最小值//调整树,根节点值最大while(maxIndex>1){//左叶子结点if (maxIndex % 2 == 0) {tree[maxIndex / 2] = Math.max(tree[maxIndex] ,tree[maxIndex + 1]);} else {tree[maxIndex / 2] = Math.max(tree[maxIndex] ,tree[maxIndex - 1]);}maxIndex/=2;//指向父节点
            }data[i] = tree[1];   //将树根节点赋值于data
        }}

算法二之树形选择排序相关推荐

  1. java中的排序算法——简单选择排序,树形选择排序与堆排序(一)

    package com.sort; /**  * 选择排序:  * 简单选择排序,树形选择排序与堆排序  *   */ public class SelecSortDemo { /** * ----- ...

  2. 输入法按照选字频率排序的C语言程序算法,算法与数据结构之选择排序(C语言)...

    #include #include void SelectSort(int *a,int n);//预声明要调用的函数 int main(void) { int k; int x[]={,,,,,,, ...

  3. 数据结构 - 树形选择排序 (tree selection sort) 具体解释 及 代码(C++)

    树形选择排序 (tree selection sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 算法逻辑: 依据节点的大小, ...

  4. 算法一之简单选择排序

    一.  选择排序的思想 选择排序的基本思想是:每一趟在n-i+1(i=1,2,-n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录.基于此思想的算法主要有简单选择排序.树型选择排序和堆排序. ...

  5. 数据结构排序系列详解之六 树形选择排序

    这篇博客接着来说说选择类排序之一的排序:树形选择排序 在简单选择排序中,每次的比较都没有用到上次比较的结果,所以比较操作的时间复杂度是O(N^2),想要降低比较的次数,则需要把比较过程中的大小关系保存 ...

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

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

  7. 排序总结(排序算法稳定性、如何选择排序算法以及排序算法常见的坑)

    一.稳定性 处理相等数时的态度,可以决定算法的稳定性 时间复杂度为O(N^2) 空间复杂度O(1)的排序: 选择排序:无稳定性 冒泡排序:有稳定性 插入排序:有稳定性 时间复杂度为O(N*logN)的 ...

  8. 【排序算法】图解简单选择排序(图解堪比Debug显示每次循环结果)

    [排序算法]图解简单选择排序(图解堪比Debug分析每次循环结果) 写在前面: 本文主要介绍简单选择排序算法,通过图片一步步解释每一趟每一次的后移.代码通过C#实现,并输出每一次交换的情况和比较次数, ...

  9. 树形选择排序的基本概念

    树形选择排序(Tree Selection Sort),是一种按照锦标赛的思想进行选择排序的方法.此方法在计算机运算中,是以程序命令体现完成,最后来达到理想的排序目的.

最新文章

  1. 量子计算的符号表示(Dirac notation)
  2. ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的区别
  3. 【 C 】assert.h 简明介绍
  4. getpeername函数与getsockname函数的介绍
  5. Shell(6)——if语句
  6. Linux 关闭桌面方法
  7. CSS 学习路线(一)元素
  8. 介绍6款热门的SpringCloud微服务开源项目,总有适合你的!
  9. java中日历类的用法_java日期类的用法
  10. knife4j--api请求参数不一致问题
  11. tomcat 远程调试
  12. 面向对象的三大特性 - 继承、多态、封装
  13. 岩土工程颗粒流软件PFC6.0技巧——按计算时间导出数据、图像及保存文件
  14. MBTI性格测试:你是哪种动物?准到可怕!
  15. linux文件解压缩加解密
  16. 如何在地图上按地址搜索位置
  17. python下载电影_python爬取电影并下载
  18. java程序员怎么创建自己的网站:第一章:总体流程,我崩溃了
  19. pytest与coverage联合使用
  20. 《精通以太坊》预言机

热门文章

  1. [JavaWeb-Servlet]概述与快速入门
  2. [Java基础]SimpleDateFormat类基础
  3. UVA - 11059 Maximum Product-暴力枚举
  4. linux apache找不到woff2,使服务器Nginx(或者Apache)支持woff2等字体文件
  5. nvcc找不到的问题(Ubuntu16.04 CUDA 8.0)
  6. char *c = abc和char c[]=abc
  7. min_25 推导及例题总结
  8. [BeiJing2011][bzoj2460] 元素
  9. P3455 [POI2007]ZAP-Queries
  10. H - Message Bomb Gym - 102798H