`
jgsj
  • 浏览: 990423 次
文章分类
社区版块
存档分类
最新评论

d-ary heaps 多叉树堆排序C++实现

 
阅读更多

之前实现了堆排序,那是构造二叉树来实现堆排序的,但是其实二叉树还可以用大于等于二叉树来实现的,就是例如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叉树”,会出现比较有趣的现象哦,最终的排序结构也是正确的,有兴趣的朋友试一试。

分享到:
评论

相关推荐

    dheap:Haxe 的快速 D-ary 堆

    在Haxe中,D-ary堆通常用于实现优先队列,这是一个特殊的队列,其中元素按照优先级排序。插入和删除元素(通常是最优先级的元素)的时间复杂度为O(logD n),其中n是堆中的元素数量。这是因为D-ary堆的结构允许快速地...

    基于正交循环码的M-ary扩频解扩新算法及FPGA实现.pdf

    基于正交循环码的M-ary扩频解扩新算法及FPGA实现.pdf

    FSK-MATLAB.rar_FSK的MATLAB_M-FSK_fsk_fsk demodulation_m-ary fsk

    标签进一步细化了主题,包括"fsk的matlab"、"m-fsk"、"fsk"、"fsk_demodulation"和"m-ary_fsk",这些标签强调了MATLAB中实现的FSK调制和解调过程,特别是M-ary FSK的解调。 在压缩包内的"FSK-MATLAB.txt"文件可能是...

    基于Filter-ary-Sketch数据结构的骨干网异常检测研究.pdf

    当检测到异常时,利用Filter-ary-Sketch中记录的数据流信息进行异常点的精确定位,这一步是实现快速响应和处理异常的关键。 为了更有效地阻断恶意流量,本文提出的方法还利用了Bloom Filter数据结构来记录源IP地址...

    M-ary QAM 的 BER 比较:使用 AWGN 信道比较不同 M-ary QAM BER 的 MATLAB 代码。-matlab开发

    本项目是关于在AWGN(Additive White Gaussian Noise,加性高斯白噪声)信道下比较不同M-ary QAM调制方式的误比特率(Bit Error Rate, BER)的MATLAB实现。 MATLAB是一种强大的数值计算和数据可视化工具,常用于...

    国外一个很好的C++ tree 库

    标题中提到的“国外一个很好的C++ tree库”可能指的是STL中的`std::set`或`std::map`,它们在内部实现为红黑树,或者是其他第三方库,如` Boost.Graph`库中的树结构。不过,由于具体库名未给出,我们将以一般性的...

    q-Ary完美量子码的分类

    4. q-Ary完美量子码的参数(Parameters of q-Ary Perfect Quantum Codes):对于q-Ary完美量子码,存在特定的参数格式,即具有参数(((q(21)-1)/(q(2)-1),q(n-21),3))(q)。这些参数代表了量子码的...

    SIMULATION OF M-ARY PSK_matlab_

    **M-ary 相移键控(M-PSK)模拟在MATLAB中的实现** M-ary相移键调制(M-PSK)是一种数字调制技术,它通过改变载波信号的相位来传输信息。在M-PSK系统中,“M”表示可以采用的相位状态数量,通常为2的幂次。例如,...

    SIMULATION OF M-ARY FSK_matlab_#Mírate_M-FSK_

    "M-ARY"表示有M种不同的频率状态,"FSK"代表频移键控,而"Mírate"可能是指项目的名字或者一种特定的实现方法。因此,这个项目可能是关于使用MATLAB进行MFSK调制的仿真。 **描述解析:** "Simulation of M-Ary FSK ...

    k-ary-tree:K元树,数组实现

    **K元树(K-Ary Tree):** K元树是一种特殊的树形数据结构,其中每个节点最多可以有k个子节点。与二叉树(2元树)和三叉树(3元树)等更常见的类型相比,K元树在k值大于2时提供了更大的灵活性,使得数据组织和检索...

    Tree为架构之XML结构化[借鉴].pdf

    K-ary树是一种每个节点最多有K个子节点的树形数据结构,而在XML的上下文中,K-ary树可以被用来表示文档的层级关系。然而,单个K-ary树可能会因为XML文档结构的复杂性而面临空间效率和性能问题。论文指出,多重K i-...

    Nonparameter Nonlinear Phase Noise Mitigation by Using M-ary Support Vector Machine for Coherent Optical Systems

    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布谷鸟过滤器:用于集合成员资格查找的节省空间的数据结构

    这意味着,在某些应用场景下,D-Ary布谷鸟过滤器相比传统的布隆过滤器或标准的布谷鸟过滤器,可以在空间占用上实现更大幅度的节省。 #### 关键词解释 - **数据结构**:计算机科学中的一个重要概念,用于组织、管理...

    k-Ary Search on Modern Processors-计算机科学

    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_

    **标题解析:** "SIMULATION OF M ARY_m-aryask_matlab_" 这个标题提到了M-ARY ASK的模拟,其中"M-ARY"通常代表多进制(Multiple-Arity),指的是数字信号可以取多种不同状态之一,而"ASK"是Amplitude Shift Keying...

    topsismatlab代码-Preference-modeling-with-TOPSIS-using-N-ary-norm-operato

    matlab代码Preference-modeling-with-TOPSIS-using-N-ary-norm-operators 在此版本中,可以找到 n 元 TOPSIS 的 matlab 代码,该代码使用 n 元范数运算符根据实际问题设置对正理想解或负理想解的偏好。 基本 TOPSIS ...

    M-mary.rar_M ary乘方算法_Mary

    总之,M-ary乘方算法,特别是它的二进制实现——快速幂运算,是计算机科学中不可或缺的工具。通过巧妙地利用二进制位操作,我们可以高效地完成模指数运算,这对于许多信息安全和计算密集型任务至关重要。理解并掌握...

Global site tag (gtag.js) - Google Analytics