之前实现了堆排序,那是构造二叉树来实现堆排序的,但是其实二叉树还可以用大于等于二叉树来实现的,就是例如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叉树”,会出现比较有趣的现象哦,最终的排序结构也是正确的,有兴趣的朋友试一试。
分享到:
相关推荐
在Haxe中,D-ary堆通常用于实现优先队列,这是一个特殊的队列,其中元素按照优先级排序。插入和删除元素(通常是最优先级的元素)的时间复杂度为O(logD n),其中n是堆中的元素数量。这是因为D-ary堆的结构允许快速地...
基于正交循环码的M-ary扩频解扩新算法及FPGA实现.pdf
标签进一步细化了主题,包括"fsk的matlab"、"m-fsk"、"fsk"、"fsk_demodulation"和"m-ary_fsk",这些标签强调了MATLAB中实现的FSK调制和解调过程,特别是M-ary FSK的解调。 在压缩包内的"FSK-MATLAB.txt"文件可能是...
当检测到异常时,利用Filter-ary-Sketch中记录的数据流信息进行异常点的精确定位,这一步是实现快速响应和处理异常的关键。 为了更有效地阻断恶意流量,本文提出的方法还利用了Bloom Filter数据结构来记录源IP地址...
本项目是关于在AWGN(Additive White Gaussian Noise,加性高斯白噪声)信道下比较不同M-ary QAM调制方式的误比特率(Bit Error Rate, BER)的MATLAB实现。 MATLAB是一种强大的数值计算和数据可视化工具,常用于...
标题中提到的“国外一个很好的C++ tree库”可能指的是STL中的`std::set`或`std::map`,它们在内部实现为红黑树,或者是其他第三方库,如` Boost.Graph`库中的树结构。不过,由于具体库名未给出,我们将以一般性的...
4. q-Ary完美量子码的参数(Parameters of q-Ary Perfect Quantum Codes):对于q-Ary完美量子码,存在特定的参数格式,即具有参数(((q(21)-1)/(q(2)-1),q(n-21),3))(q)。这些参数代表了量子码的...
**M-ary 相移键控(M-PSK)模拟在MATLAB中的实现** M-ary相移键调制(M-PSK)是一种数字调制技术,它通过改变载波信号的相位来传输信息。在M-PSK系统中,“M”表示可以采用的相位状态数量,通常为2的幂次。例如,...
"M-ARY"表示有M种不同的频率状态,"FSK"代表频移键控,而"Mírate"可能是指项目的名字或者一种特定的实现方法。因此,这个项目可能是关于使用MATLAB进行MFSK调制的仿真。 **描述解析:** "Simulation of M-Ary FSK ...
**K元树(K-Ary Tree):** K元树是一种特殊的树形数据结构,其中每个节点最多可以有k个子节点。与二叉树(2元树)和三叉树(3元树)等更常见的类型相比,K元树在k值大于2时提供了更大的灵活性,使得数据组织和检索...
K-ary树是一种每个节点最多有K个子节点的树形数据结构,而在XML的上下文中,K-ary树可以被用来表示文档的层级关系。然而,单个K-ary树可能会因为XML文档结构的复杂性而面临空间效率和性能问题。论文指出,多重K i-...
The M-ary support vector machine (SVM) is introduced as a nonparameter nonlinear phase noise (NLPN) mitigation approach for the coherent optical systems. The NLPN tolerance of the system can be ...
这意味着,在某些应用场景下,D-Ary布谷鸟过滤器相比传统的布隆过滤器或标准的布谷鸟过滤器,可以在空间占用上实现更大幅度的节省。 #### 关键词解释 - **数据结构**:计算机科学中的一个重要概念,用于组织、管理...
k-Ary Search on Modern ProcessorsBenjamin Schlegel Technische Universität Dresdenbenjamin.schlegel@tu- dresden.deRainer Gemulla IBM Almaden Research Centerrgemull@us.ibm.comWolfgang Lehner Technische...
**标题解析:** "SIMULATION OF M ARY_m-aryask_matlab_" 这个标题提到了M-ARY ASK的模拟,其中"M-ARY"通常代表多进制(Multiple-Arity),指的是数字信号可以取多种不同状态之一,而"ASK"是Amplitude Shift Keying...
matlab代码Preference-modeling-with-TOPSIS-using-N-ary-norm-operators 在此版本中,可以找到 n 元 TOPSIS 的 matlab 代码,该代码使用 n 元范数运算符根据实际问题设置对正理想解或负理想解的偏好。 基本 TOPSIS ...
总之,M-ary乘方算法,特别是它的二进制实现——快速幂运算,是计算机科学中不可或缺的工具。通过巧妙地利用二进制位操作,我们可以高效地完成模指数运算,这对于许多信息安全和计算密集型任务至关重要。理解并掌握...