java数据结构排序算法之树形选择排序详解

发布时间 - 2026-01-11 01:29:33    点击率:

本文实例讲述了java数据结构排序算法之树形选择排序。分享给大家供大家参考,具体如下:

这里我们就来说说选择类排序之一的排序:树形选择排序

在简单选择排序中,每次的比较都没有用到上次比较的结果,所以比较操作的时间复杂度是O(N^2),想要降低比较的次数,则需要把比较过程中的大小关系保存下来。树形选择排序是对简单选择排序的改进。

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

算法实现代码如下:

package exp_sort;
public class TreeSelectSort {
 public static int[] TreeSelectionSort(int[] mData) {
  int TreeLong = mData.length * 4;
  int MinValue = -10000;
  int[] tree = new int[TreeLong]; // 树的大小
  int baseSize;
  int i;
  int n = mData.length;
  int max;
  int maxIndex;
  int treeSize;
  baseSize = 1;
  while (baseSize < n) {
   baseSize *= 2;
  }
  treeSize = baseSize * 2 - 1;
  for (i = 0; i < n; i++) {
   tree[treeSize - i] = mData[i];
  }
  for (; i < baseSize; i++) {
   tree[treeSize - i] = MinValue;
  }
  // 构造一棵树
  for (i = treeSize; i > 1; i -= 2) {
   tree[i / 2] = (tree[i] > tree[i - 1] ? tree[i] : tree[i - 1]);
  }
  n -= 1;
  while (n != -1) {
   max = tree[1];
   mData[n--] = max;
   maxIndex = treeSize;
   while (tree[maxIndex] != max) {
    maxIndex--;
   }
   tree[maxIndex] = MinValue;
   while (maxIndex > 1) {
    if (maxIndex % 2 == 0) {
     tree[maxIndex / 2] = (tree[maxIndex] > tree[maxIndex + 1] ? tree[maxIndex]
       : tree[maxIndex + 1]);
    } else {
     tree[maxIndex / 2] = (tree[maxIndex] > tree[maxIndex - 1] ? tree[maxIndex]
       : tree[maxIndex - 1]);
    }
    maxIndex /= 2;
   }
  }
  return mData;
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  int array[] = { 38, 62, 35, 77, 55, 14, 35, 98 };
  TreeSelectionSort(array);
  for (int i = 0; i < array.length; i++) {
   System.out.print(array[i] + " ");
  }
  System.out.println("\n");
 }
}

算法分析:

在树形选择排序中,除了最小的关键字,被选出的最小关键字都是走了一条由叶子结点到跟节点的比较过程,由于含有n个叶子结点的完全二叉树的深度log2n+1,因此在树形选择排序中,每选出一个较小关键字需要进行log2n次比较,所以其时间复杂度是O(nlog2n),移动记录次数不超过比较次数,故总的算法时间复杂度为O(nlog2n),与简单选择排序算法相比,降低了比较次数的数量级,增加了n-1个额外的存储空间存放中间比较结果。

补充:

这里再来介绍对树形选择排序的改进算法,即堆排序算法。

堆排序弥补了树形选择排序算法占用空间多的缺憾。采用堆排序时,只需要一个记录大小的辅助空间。

算法思想是:

把待排序记录的关键字存放在数组r[1...n]中,将r看成是一棵完全二叉树的顺序表示,每个结点表示一个记录,第一个记录r[1]作为二叉树的根,以下每个记录r[2...n]依次逐层从左到右顺序排列,任意结点r[i]的左孩子是r[2*i],右孩子是r[2*i+1];双亲是r[[i/2]]。

堆定义:各结点的关键字值满足下列条件:

r[i].key >= r[2i].key 且 r[i].key >= r[2i+1].key   (i=1,2,……[i/2])

满足上面条件的完全二叉树称为大根堆;相反,如果这颗完全二叉树中任意结点的关键字小于或者等于其左孩子和右孩子的关键字,对应的堆叫做小根堆。

堆排序的过程主要需要解决两个问题:第一个是,按照堆定义建初堆;第二个是,去掉最大元后重建堆,得到次大元。

堆排序即是利用堆的特性对记录序列进行排序,过程如下:

1、对给定序列建堆;
2、输出堆顶;(首元素与尾元素交换)
3、对剩余元素重建堆;(筛选首元素)
4、重复2,3,直至所有元素输出。

注意:“筛选”须从第[n/2]个结点开始,逐层向上倒退,直到根结点。

算法分析:

1. 对深度为 k 的堆,“筛选”所需进行的关键字比较的次数至多为2(k-1);
2. n 个关键字的堆深度为  [log2n]+1, 初建堆所需进行的关键字比较的次数至多为:n* [log2n];
3. 重建堆 n-1 次,所需进行的关键字比较的次数不超过:(n-1)*2 [log2n ]; 

因此,堆排序在最坏情况下,其时间复杂度为O(nlog2n),这是堆排序的最大优点。

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。


# java  # 数据结构  # 排序  # 算法  # 树形选择排序  # Java 将list集合数据按照时间字段排序的方法  # java数据结构与算法之桶排序实现方法详解  # Java数据结构常见几大排序梳理  # 使用Java如何对复杂的数据类型排序和比大小  # 所需  # 二叉树  # 第一个  # 不超过  # 较小  # 都是  # 这是  # 操作技巧  # 是一种  # 放在  # 相关内容  # 走了  # 感兴趣  # 要把  # 第二个  # 给大家  # 再来  # 只需要  # 即是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何解决hover在ie6中的兼容性问题  Laravel Fortify是什么,和Jetstream有什么关系  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  音乐网站服务器如何优化API响应速度?  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  如何安全更换建站之星模板并保留数据?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  实现点击下箭头变上箭头来回切换的两种方法【推荐】  千库网官网入口推荐 千库网设计创意平台入口  如何在香港免费服务器上快速搭建网站?  如何在服务器上配置二级域名建站?  LinuxShell函数封装方法_脚本复用设计思路【教程】  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  Linux后台任务运行方法_nohup与&使用技巧【技巧】  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  如何在 React 中条件性地遍历数组并渲染元素  利用vue写todolist单页应用  JavaScript如何实现继承_有哪些常用方法  Python结构化数据采集_字段抽取解析【教程】  详解jQuery中基本的动画方法  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Laravel PHP版本要求一览_Laravel各版本环境要求对照  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  如何挑选优质建站一级代理提升网站排名?  如何为不同团队 ID 动态生成多个非值班状态按钮  Angular 表单中正确绑定输入值以确保提交与验证正常工作  如何实现javascript表单验证_正则表达式有哪些实用技巧  python中快速进行多个字符替换的方法小结  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Internet Explorer官网直接进入 IE浏览器在线体验版网址  如何在Ubuntu系统下快速搭建WordPress个人网站?  如何在阿里云购买域名并搭建网站?  如何快速搭建二级域名独立网站?  jQuery validate插件功能与用法详解  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  中国移动官方网站首页入口 中国移动官网网页登录  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  个人摄影网站制作流程,摄影爱好者都去什么网站?  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  网站制作软件免费下载安装,有哪些免费下载的软件网站?  LinuxCD持续部署教程_自动发布与回滚机制  Laravel如何实现API资源集合?(Resource Collection教程)  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法