C++动态数组简单模拟二叉堆

//C++动态数组简单模拟二叉堆
#include<iostream>

using namespace std;

class BinaryHeap
{
private:
	int cap;  //数组最大容量
	int size; //当前元素个数
	int* datas; //数组首地址
public:
	explicit BinaryHeap(int cap_) :cap(cap_), size(0)
	{
		datas = new int[cap];
	}
	~BinaryHeap(){ delete datas; }
	void Insert(int);
	int DeleteMin();
};

//用数组表示的树,当下标从0开始时,i为当前节点,i*2+1为i的左子树节点,i*2+2为i的右子树节点,i/2为i的父节点

void BinaryHeap::Insert(int data)
{
	int i;
	for (i = size; i / 2 >= 0 && datas[i / 2] > data; i /= 2) //上滤
	{
		datas[i] = datas[i / 2];
	}
	datas[i] = data;
	size++;
}

int BinaryHeap::DeleteMin()
{
	int i = 0, child = 0;
	int lastdata = datas[--size];
	int mindata = datas[0];
	for (i = 0; i * 2 + 1 <= size-1; i = child)   //下滤
	{
		child = i * 2 + 1;
		if (child < size-1 && datas[child + 1] < datas[child])
		{
			child++;
		}
		if (lastdata > datas[child])
		{
			datas[i] = datas[child];
		}
		else
		{
			break;
		}
	}
	datas[i] = lastdata;
	return mindata;
}

int main()
{
	BinaryHeap t(400);

	for (int i = 0; i < 100; i++)
		t.Insert(i);
	for (int i = 200; i > 100; i--)
		t.Insert(i);

	for (int i = 0; i < 200; i++)
		cout << t.DeleteMin() << endl;

	cin.get();
	return 0;
}

时间: 2024-11-12 13:57:48

C++动态数组简单模拟二叉堆的相关文章

二叉堆部分练习

本练习主要做了几个工作: 1.给定一个数组来初始化二叉堆,第一种方法是通过不断插入,时间复杂度是O(nlgn),第二种方法是先把数组填入二叉堆,再从下标为H->SIZE/2的节点开始下滤,这是因为只有下标小于为H->SIZE/2才有孩子,从而可以用线性时间完成二叉堆的初始化. 2.二叉堆的下滤和上滤,对二叉堆关键字的操作诸如删除最小,增加某关键字值,减少某关键字值等会可能改变堆性质的操作,必须用上滤和下滤来保证二叉堆的性质,比如增加了某关键字的值,该关键字可能往下走,因此对该节点采用下滤,与之

二叉堆 - 最大堆

与上篇<二叉堆 - 最小堆>类似,只不过堆序(heap order)从内部节点小于左右子节点变成了内部节点大于左右子节点. 代码如下: 1 #include <cstdio> 2 #include <cstdlib> 3 4 #define MIN (1<<(sizeof(int)*8-1)) 5 #define MAX (~MIN) 6 7 typedef int Item; 8 typedef struct HeapStruct* heap; 9 10

优先队列(一)——二叉堆

二叉堆的抽象数据类型: 1 #ifndef _BinHeap_H 2 #define ElementType int 3 #define MinElement -1000 4 struct HeapStruct; 5 typedef struct HeapStruct *PriorityQueue; //结构体指针 6 PriorityQueue Initialize(int MaxElements); //初始化一个二叉堆 7 void Destroy(PriorityQueue H); //

二叉堆的构建(Java)

1 package com.rao.linkList; 2 3 /** 4 * @author Srao 5 * @className BinaryHeap 6 * @date 2019/12/3 14:14 7 * @package com.rao.linkList 8 * @Description 二叉堆 9 */ 10 public class BinaryHeap { 11 12 /** 13 * 在插入一个节点之后,数组进行上浮 14 * @param arr:左孩子等于n*2+1,右

C++动态数组简单的模拟二元堆

//C++动态数组简单的模拟二元堆 #include<iostream> using namespace std; class BinaryHeap { private: int cap; //该阵列的最大容量 int size; //当前元素个数 int* datas; //数组首地址 public: explicit BinaryHeap(int cap_) :cap(cap_), size(0) { datas = new int[cap]; } ~BinaryHeap(){ delet

POJ2442——Squence(二叉堆+动态规划 | 滚动数组)

本文出自:http://blog.csdn.net/svitter 题意分析: Given m sequences, each contains n non-negative integer. Now we may select one number from each sequence to form a sequence with m integers. It's clear that we may get n ^ m this kind of sequences. Then we can

二叉堆的应用——查找长度为N数组中第M大数

看到这个题目首先想到是排序,那么时间复杂度自然就是O(NlgN).那么使用二叉堆如何解决呢? 对于下面一个数组,共有12个元素,我们的目标就是找出第5大元素——12 首先建立一个具有M个元素的最小堆,那么堆顶是这M个元素的最小值,接下来遍历剩下的元素,如果一个元素小于堆顶元素则不做任何操作,如果大于堆顶元素,则替换该元素,并且调整最小堆.显然最后堆的M个元素是最大的M个元素,而它们中最小的正式堆顶元素. 实现代码 Heap <Integer> h = new Heap<>(); I

纯数据结构Java实现(6/11)(二叉堆&amp;优先队列)

堆其实也是树结构(或者说基于树结构),一般可以用堆实现优先队列. 二叉堆 堆可以用于实现其他高层数据结构,比如优先队列 而要实现一个堆,可以借助二叉树,其实现称为: 二叉堆 (使用二叉树表示的堆). 但是二叉堆,需要满足一些特殊性质: 其一.二叉堆一定是一棵完全二叉树 (完全二叉树可以用数组表示,见下面) 完全二叉树缺失的部分一定是在右下方.(每层一定是从左到右的顺序优先存放) 完全二叉树的结构,可以简单理解成按层安放元素的.(所以数组是不错的底层实现) 其二.父节点一定比子节点大 (针对大顶堆

算法—二叉堆

实现栈或是队列与实现优先队列的最大不同在于对性能的要求.对于栈和队列,我们的实现能够在常数时间内完成所有操作:而对于优先队列,插入元素和删除最大元素这两个操作之一在最坏情况下需要线性时间来完成.我们接下来要讨论的基于数据结构堆的实现能够保证这两种操作都能更快地执行. 1.堆的定义 数据结构二叉堆能够很好地实现优先队列的基本操作.在二叉堆的数组中,每个元素都要保证大于等于另两个特定位置的元素.相应地,这些位置的元素又至少要大于等于数组中的另两个元素,以此类推.如果我们将所有元素画成一棵二叉树,将每