二叉树 - 最大堆

maxheap.h

#include <iostream>

template <typename T>
class MaxHeap
{
public:
	MaxHeap(int num);
	MaxHeap(T Arr[], int arrsize, int totalsize);
	bool insert(const T&);
	bool del(T&);
	void show() const;
	void showonlevel() const;
private:
	T* arr;
	int size, max_size;
};

template <typename T>
MaxHeap<T>::MaxHeap(int num)
{
	arr = new T [num + 1];
	max_size = num;
	size = 0;
}

template <typename T>
MaxHeap<T>::MaxHeap(T Arr[], int arrsize, int totalsize)
{
	arr = new T [totalsize + 1];
	max_size = totalsize;
	size = arrsize;
	arr = Arr;

	int loc, cloc;

	for (loc = size/2; loc >= 1; --loc)
	{
		T tmp = arr[loc];
		cloc = loc * 2;
		while (cloc <= size)
		{
			if (cloc < size && arr[cloc + 1] > arr[cloc])
				++cloc;
			if (tmp > arr[cloc])
				break;
			arr[cloc/2] = arr[cloc];
			cloc *= 2;
		}
		arr[cloc/2] = tmp;
	}
}

template <typename T>
bool MaxHeap<T>::insert(const T& val)
{
	if (size == max_size)
		return false;
	int num = ++size;
	while (num > 1 && val > arr[num/2])
	{
		arr[num] = arr[num/2];
		num /= 2;
	}
	arr[num] = val;
	return true;
}

template <typename T>
bool MaxHeap<T>::del(T& val)
{
	if (size == 0)
		return false;
	val = arr[1];
	T tmp = arr[size--];
	int loc = 1, cloc = 2;
	while (cloc <  size)
	{
		if (cloc < size && arr[cloc + 1] > arr[cloc])
			++cloc;
		if (tmp > arr[cloc])
			break;
		arr[loc] = arr[cloc];
		loc = cloc;
		cloc *= 2;
	}
	arr[loc] = tmp;
	return true;
}

template <typename T>
void MaxHeap<T>::show()const
{
	for (int i = 1; i <= size; ++i)
		std::cout <<arr[i] <<" ";
	std::cout <<std::endl;
}

template <typename T>
void MaxHeap<T>::showonlevel()const
{
	int k = 1;
	for (int i = 1; i <= size; ++i)
	{
		std::cout <<arr[i] <<" ";
		if (i == k)
		{
			std::cout <<std::endl;
			k = k*2 + 1;
		}
	}
	std::cout <<std::endl;
}

main.cpp

#include <iostream>
#include "maxheap.h"

int main()
{
	MaxHeap<int> a(30);
	int c[32];
	for (int i = 1 ; i <= 30; i++)
	{
		c[i] = rand();
		a.insert(c[i]);
	}
	a.showonlevel();
	std::cout <<std::endl;
	MaxHeap<int> b(c, 30,40);
	b.showonlevel();
	std::cout <<std::endl;
	std::cin.get();
	return 0;
}
时间: 2024-10-21 06:47:36

二叉树 - 最大堆的相关文章

堆排序 Heapsort

堆排序: 1 #include<stdio.h> 2 //#include<stdlib.h> 3 4 void PrintArray(int data[] ,int length){ 5 int i; 6 for(i=0;i<length;i++){ 7 printf("%d ",data[i]); 8 } 9 printf("\n"); 10 } 11 12 //heap_size;堆的大小 13 // 堆化,保持堆的性质 14 /

排序详解(希尔,快排,归并等)

今天集中把几种排序的方法列一下,当然最出名的希尔,快排,归并和其优化当然也是满载 说到希尔排序的话,不得不先提到的就是插入排序了,希尔排序就是对直接插入排序的一种优化,下面就是直接插入排序的思想 1 void InsertSort(int *a, size_t size) 2 { 3 assert(a); 4 for (int i = 1; i < size; ++i) 5 { 6 int index = i; 7 int tmp = a[index]; 8 int end = index -

堆排序理解 完整代码

/* <转自 http://www.wutianqi.com/?p=1820 > 自我修改 * Note: 堆排序(Heap Sort) */ #include <iostream> using namespace std; // 输出当前堆的排序状况 void PrintArray(int data[], int size) { for (int i=1; i<=size; ++i) cout <<data[i]<<" "; co

堆排序:什么是堆?什么是最大堆?二叉堆是什么?堆排序算法是怎么样的?PHP如何实现堆排序?

本文标签:  堆排序 php php算法 堆排序算法 二叉堆 数据结构 REST   服务器 什么是堆 这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构. 堆可以视为一棵完全的二叉树,完全二叉树的一个"优秀"的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素. 数组与堆之间的关系 二叉堆一般分为两种:最大堆和最小堆. 什么是最大堆 堆中每个父节点的元素值都大于等于其孩子结点(如果存在),这样的堆就是一个最大堆 因此,最大堆中的

小堆 线索二叉树补充

1.小堆: 堆的构造,i>数组直接生成堆(向下调整),iii>插入创建堆(向上调整): (1).怎么实现一次调整? 找到最后一个非叶子结点,n/2-1:一直往下调整即可! (2)堆排----->优先级队列 堆的删除,只能是堆顶元素,再拿最后一个元素补充上去.在向下做一次调整.形成新的堆结构(满足堆的性质),将删除的数字输出就是堆排. 小堆:根(父)小于左右结点:最小的数字先出: 大堆:根(父)大于左右结点:最大的数字先出:   因而,进行堆排是就是优先级队列! 2.线索二叉树的查找父结点

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值

数据结构c++语言描述&mdash;&mdash;最大堆(MaxHeap)

一.最大堆的插入 图9-3a 给出了一个具有5个元素的最大堆.由于堆是完全二叉树,当加入一个元素形成6元素堆时,其结构必如9-3b 所示.如果插入元素的值为1,则插入后该元素成为2的左孩子,相反,若新元素的值为5,则该元素不能成为2的左孩子(否则将改变最大树的特性),应把2下移为左孩子(如图9 - 3 c所示),同时还得决定在最大堆中5是否占据2原来的位置.由于父元素20大于等于新插入的元素5,因此可以在原2所在位置插入新的元素.假设新元素的值为21而不是5,这时,同图9-3c 一样,把2下移为

C语言实现二叉树

二叉树的重要性就不用多说啦: 我以前也学习过,但是一直没有总结: 网上找到的例子,要么是理论一大堆,然后是伪代码实现: 要么是复杂的代码,没有什么解释: 最终,还是靠FQ找到一些好的文章,参考地址我会在See Also部分给大家贴出来 Problem 假设我们要生成的二叉树如下图: Solution 显然,我们需要在节点保存的数据只有一个整数: struct binary_tree { int data ; // Data area //TODO }; 所以在结构体里面,我们的代码应该类似上面的