树形选择排序

概述:

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

排序过程:

树形选择排序(Tree Selection Sort),这个过程可用一棵有n个叶子结点的完全二叉树表示。例如,图中的二叉树表示从8个数中选出最小数的过程。

8个叶子结点中依次存放排序之前的8个关键字,每个非终端结点中的关键字均等于其左、右孩子结点中较小的那个关键字,则根结点中的关键字为叶子结点中的最小关键字

在输出最小关键字之后,根据关系的可传递性,欲选出次小关键字,仅需将叶子结点中的最小关键字(13)改为“最大值”,然后从该叶子结点开始,和其左右兄弟的关键字进行比较,修改从叶子结点到根结点的路径上各结点的关键字,则根结点的关键字即为次小值

同理,可依次选出从小到大的所有数。

算法性能:

时间复杂度:由于含有n个叶子结点的完全二叉树的深度为[log2n]+1,则在树形选择排序中,除了第一次选择最小关键字需要进行 n-1 次比较以外,每选择一个次小关键字仅需进行[log2n]次比较,因此,它的时间复杂度为O(nlogn)。

空间复杂度:这种排序方法减少了许多排序时间,但是使用了较多的附加存储。

如果有 n 个对象,必须使用至少 2n-1 个结点来存放。最多需要找到满足   的 k ,使用  个结点。每个结点包括排序码、结点序号和比较标志三种信息。所以需要的辅助存储空间较多。

代码:

#include<malloc.h> /* malloc()等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<process.h> /* exit() */typedef int InfoType; /* 定义其它数据项的类型 */#define INT_MAX 999/* ---------------------------    待排记录的数据类型     ------------------------------*/#define MAXSIZE 20 /* 一个用作示例的小顺序表的最大长度 */
typedef int KeyType; /* 定义关键字类型为整型 */
typedef struct
{KeyType key; /* 关键字项 */InfoType otherinfo; /* 其它数据项,具体类型在主程中定义 */
}RedType; /* 记录类型 */typedef struct
{RedType r[MAXSIZE + 1]; /* r[0]闲置或用作哨兵单元 */int length; /* 顺序表长度 */
}SqList; /* 顺序表类型 *//* ------------------------------------------------------------------------------------------*/void TreeSort(SqList *L)
{ /* 树形选择排序 */int i, j, j1, k, k1, l, n = (*L).length;RedType *t;l = (int)ceil(log(n) / log(2)) + 1; /* 完全二叉树的层数 */k = (int)pow(2, l) - 1; /* l层完全二叉树的结点总数 */k1 = (int)pow(2, l - 1) - 1; /* l-1层完全二叉树的结点总数 */t = (RedType*)malloc(k * sizeof(RedType)); /* 二叉树采用顺序存储结构 */for (i = 1; i <= n; i++) /* 将L.r赋给叶子结点 */t[k1 + i - 1] = (*L).r[i];for (i = k1 + n; i < k; i++) /* 给多余的叶子的关键字赋无穷大 */t[i].key = INT_MAX;j1 = k1;j = k;while (j1){ /* 给非叶子结点赋值 */for (i = j1; i < j; i += 2)t[i].key < t[i + 1].key ? (t[(i + 1) / 2 - 1] = t[i]) : (t[(i + 1) / 2 - 1] = t[i + 1]);j = j1;j1 = (j1 - 1) / 2;}for (i = 0; i < n; i++){(*L).r[i + 1] = t[0]; /* 将当前最小值赋给L.r[i] */j1 = 0;for (j = 1; j < l; j++) /* 沿树根找结点t[0]在叶子中的序号j1 */t[2 * j1 + 1].key == t[j1].key ? (j1 = 2 * j1 + 1) : (j1 = 2 * j1 + 2);t[j1].key = INT_MAX;while (j1){j1 = (j1 + 1) / 2 - 1; /* 序号为j1的结点的双亲结点序号 */t[2 * j1 + 1].key <= t[2 * j1 + 2].key ? (t[j1] = t[2 * j1 + 1]) : (t[j1] = t[2 * j1 + 2]);}}free(t);
}void print(SqList L)
{int i;for (i = 1; i <= L.length; i++)printf("(%d,%d)", L.r[i].key, L.r[i].otherinfo);printf("\n");
}#define N 8
void main()
{RedType d[N] = { {49,1},{38,2},{65,3},{97,4},{76,5},{13,6},{27,7},{49,8} };SqList l;int i;for (i = 0; i < N; i++)l.r[i + 1] = d[i];l.length = N;printf("排序前:\n");print(l);TreeSort(&l);printf("排序后:\n");print(l);
}

运行结果:

树形选择排序(第十章 P279)相关推荐

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

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

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

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

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

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

  4. 算法二之树形选择排序

    一.树形选择排序的基本思想 (1) 树形选择排序又称锦标赛排序(Tournament Sort),是一种按照锦标赛的思想进行选择排序的方法.首先对n个记录的关键字进行两两比较,然后在n/2个较小者之间 ...

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

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

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

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

  7. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  8. 面试官:你都工作3年了,连选择排序法都不会,我怎么能选择你

    面试时,算法经常会遇到,特别是一些常见的算法. 张工毕业3年了,一直在一家创业公司做python开发,最近到某知名互联网公司面试,做了笔试题后,面试官看了觉得还不错,于是想进一步考察张工的编码能力,就 ...

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

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

  10. 数据结构——排序:插入排序、选择排序、交换排序、归并排序、基数排序

    排序 内部排序:数据量不大,在内存中可以完成排序. 外部排序:借助外存.把数据文件分成若干块,涉及内外存数据的转换.存储器的管理等. 稳定排序:能保证排序前两个相等的数其在序列的前后位置顺序和排序后它 ...

最新文章

  1. 使用sed和awk取除最后两个字段之外的字段
  2. Java多线程闲聊(五):AQS
  3. sql自动生成工具_可自动生成代码,5款基于AI的开发工具
  4. linux cache buffer区别,Linux buffer/cache异同
  5. Nginx学习总结(5)——Nginx基本配置备忘
  6. 蓝桥杯 ADV-89 算法提高 输出九九乘法表
  7. spring boot demo( 获取一个RESTful web service)
  8. java并发线程池---了解ThreadPoolExecutor就够了
  9. win10安装steam有损计算机,Win10安装steam平台提示“steam fatal error”报错的解决方法...
  10. 23 - OAI NSA gNB搭建 - 博一
  11. win10+Ubuntu18.04.2双系统双硬盘安装及分区
  12. 基于BP神经网络控制+Simulink双闭环直流调速系统仿真
  13. 基于PHP和MySQL的奶茶网站,基于PHP和MySQL的网站设计与实现
  14. Python之ARP协议探测MAC地址
  15. 单点故障(用通俗易懂的语言告诉你)
  16. 问题解决:java.sql.SQLException: No suitable driver found for jdbc:mysql
  17. 石油石化生产企业该如何防止电网晃电发生和发生晃电时保证敏感负荷的设备正常运行
  18. 二叉树的非递归遍历详解
  19. 2022年上海市安全员C证最新解析及上海市安全员C证考试技巧
  20. 基于C语言的网络电子词典

热门文章

  1. 基于QT的英文文献的编辑与检索系统的实现
  2. SPI 读取不同长度 寄存器_几种常用的总线设计:UART/SPI/I2C
  3. 如何用微云永久外链MP3做QQ空间背景音乐?
  4. 美国计算机硕士要读多久,去美国读研究生需要多久 各专业时长一览
  5. 【预测模型】基于天牛须算法BAS优化BP神经网络实现数据预测matlab源码
  6. vivo8.0系统机器最完美激活xposed框架的方法
  7. U盘量产后USB鼠标和键盘都无法使用,如何解决?
  8. JRE瘦身 制作小工具
  9. dumprep -0 -k
  10. k8s-----安全机制