之前实现了堆排序,那是构造二叉树来实现堆排序的,但是其实二叉树还可以用大于等于二叉树来实现的,就是例如3叉树每个节点有三个孩子,4叉树,每个节点有四个孩子,等等。

这个是算法导论的一道Problem,其实该注意的地方和堆排序是一样的,所以有了二叉树堆排序的基础之后就很好实现多叉树了。

下面是C++程序:

#include<iostream>
#include<vector>using namespace std;int gDary = 5;
//全局函数指定多少分叉树,这里是5,代表5叉树。
int heapDaryParent(int cIndex)  //cIndex 为C下标0开始
{return (cIndex-1)/gDary;
}int heapDaryChild(int cIndex, int d)   //cIndex 为C下标0开始,d为第几个孩子从1开始
{return cIndex*gDary+d;
}//找出当前节点和其孩子们的当中的最大值;
//本人觉得是本人创造的非常妙的从daryHeapify函数中分离出来的功能函数。极大的简化了对本算法的理解。
template<typename T>
int daryMax(vector<T>& heap, int cIndex, int heapSize)
{T tempMax = heap[cIndex];int childIndex = 0;int tempIndex = cIndex;for(int i = 1; i<=gDary; i++){childIndex = heapDaryChild(cIndex, i);if(childIndex<heapSize){if(heap[childIndex]>tempMax){tempMax = heap[childIndex];tempIndex = childIndex;}}}return tempIndex;
}//We assume cIndex's children have all been heapified, which is the key to make this algorithm work!!!
//比之前的二叉树堆排序更加简洁明了点
template<typename T>
void daryHeapify(vector<T>& heap, int cIndex, int heapSize)
{if(cIndex<heapSize){int tempIndex = daryMax(heap, cIndex, heapSize);if(tempIndex != cIndex){swap(heap[cIndex], heap[tempIndex]);daryHeapify(heap, tempIndex, heapSize); }}
}template<typename T>
void buildMaxDaryHeap(vector<T>& heap)
{for(int i=(heap.size()-1)/gDary; i>=0; i--)daryHeapify(heap, i, heap.size());
}template<typename T>
void daryHeapSort(vector<T>& heap)
{buildMaxDaryHeap(heap);for(int i=heap.size()-1; i>0; i--){swap(heap[0], heap[i]);daryHeapify(heap, 0, i);}
}template<typename T>
void heapPrint(const vector<T>& heap)
{for(auto x:heap){cout<<x<<" ";}cout<<endl;
}void test()
{//初始化数组int a[15] = {2,4,7,1,4,8,9,31,83,28,48,94,87,16,36};vector<int> heap(a, a+15);//序列输出cout<<"Befor build heap:\n";heapPrint(heap);//建立大顶堆后输出buildMaxDaryHeap(heap);cout<<"After build heap:\n";heapPrint(heap);//排序后cout<<"After sort:\n";daryHeapSort(heap);heapPrint(heap);
}int main()
{test();return 0;
}

可以修改全局函数gDary=2,或3,或4等,看看结果如何变化:

gDary=2二叉树

三叉树:

四叉树:

五叉树:

可以看出构造的树都不一样的,但是最终的排序结构都正确的。

甚至可以设置gDary为1,为100,成为“1叉树”“100叉树”,会出现比较有趣的现象哦,最终的排序结构也是正确的,有兴趣的朋友试一试。

d-ary heaps 多叉树堆排序C++实现相关推荐

  1. 数据结构与算法:树 二叉树入门(一)

    Tips: 采用java语言,关注博主,底部附有完整代码 工具:IDEA 本系列介绍的是数据结构: 树 这是第1篇目前计划一共有12篇: 二叉树入门 本篇 顺序二叉树 线索化二叉树 堆排序 赫夫曼树( ...

  2. 【CF538F】 A Heap of Heaps

    题目 展开 题目描述 Andrew skipped lessons on the subject 'Algorithms and Data Structures' for the entire ter ...

  3. 浅谈树形结构的特性和应用(上):多叉树,红黑树,堆,Trie树,B树,B+树......

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 上篇文章我们主要介绍了线性数据结构,本篇233酱带大家看看 无所不 ...

  4. 上标3下标6算法_图解堆排序算法

    堆排序定义 一般来说,算法就像数学公式,前人经过不断优化和验证得到有规律性的公式留给后人使用,当然也会交给后人验证的思路.那么堆排序算法就是这样,它有基本固定的定义如下: 1.将数组构建为一颗有规则的 ...

  5. 【java排序】 归并排序算法、堆排序算法

    一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...

  6. java 实现 堆排序算法_C程序实现堆排序算法

    java 实现 堆排序算法 Heap Sort is a comparison-based sorting algorithm that makes use of a different data s ...

  7. C#:TopK:1万个数取前最大的100,堆排序

    把1万个数字的前100个 首先放入数组,构成最小堆 再循环100到一万之间的. 每次循环判断当前数字是否大于ary[0] 当大于时,首先把头节点remove,再把当前数字放入ary[0], 在那100 ...

  8. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

  9. 十大经典排序算法(图解与代码)——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序(Python and Java)

    排序 重新排列表中的元素,使表中的元素按照关键字递增或者递减 内部排序: 指在排序期间,元素全部存放在内存中的排序 外部排序: 指在排序期间元素无法全部同时存放在内存中,必须在排序的过程中根据要求不断 ...

最新文章

  1. android中的显示跳转和隐式跳转
  2. libcurl实现解析(3) - libcurl对select的使用
  3. Divide and Sum CodeForces - 1445D(排列组合+逆元)
  4. Linux的企业-Codis 3集群搭建详解
  5. excel字符串和单元格拼接_Excel单元格内计算式及字符串拼接实现
  6. java 协同编辑的多指针_多人协作项目如何保持代码风格统一
  7. 有趣的计算机黑科技,7个让你欲罢不能的电脑黑科技神器!每一款都让人爱不释手...
  8. vscode+TexLive+SumatraPDF
  9. matlab 取模二和,取模(mod)与取余(rem)的区别——Matlab学习笔记
  10. 常用零部件尺寸公差标注方法
  11. Java图形用户界面
  12. 双系统启动修复完整解决方案
  13. 基于RTP/RTCP的无线视频传输自适应带宽控制
  14. Linux内核网络:实现与理论--介绍
  15. codeforces 702F 可持久化平衡树
  16. 虚函数,虚函数表,虚函数实现原理,虚函数实现机制,虚函数解决的问题
  17. 无线网关怎样对接VOS?
  18. 影视推荐的相关处理方法的思维导图
  19. c语言中的头文件stdlib.h的作用,c语言includestdlib.h什么意思?
  20. Adobe Illustrator 2020 24.2.3.521 中文版 — 矢量绘图软件

热门文章

  1. 阿里云漏洞验证需要付费的解决方法
  2. Excel.Application组件使用方法,适合应用于使用EXCEL组件做WEB应用开发。
  3. 为什么我从PR里面导出来的视频,在电脑上播放是正常的,微信发给朋友后,形状就变了,扭曲了一样的
  4. 电脑桌面显示两个计算机,电脑如何用两个显示器_怎么一台主机两个显示器-win7之家...
  5. SyntaxError :invalid syntax错误解决办法
  6. unity 动态图集
  7. react-native 使用高德SDK取得位置信息
  8. MySQL [1093] You can‘t specify target table ‘titles_test‘ for update in FROM clause
  9. 基于51单片机HX711的电子秤称重计价proteus仿真程序设计
  10. Latex 的交叉引用