heap


//最大堆
#ifndef HEAP_H_
#define HEAP_H_

#include <vector>
using namespace std;
class Heap
{
private:
	vector<int> heapData;

	int heapSize;                               //堆中元素的个数
public:
	Heap(int *arr,int n);                       //构造函数,n为数组元素个数
	void percolateUp(int index, int value);      //从index(下标)上溯
	void adjustHeap(int holeIndex, int value);        //调整以holeIndex为根的子树为堆
	void pushHeap(int addValue);
	void popHeap(int choose=0);                 //默认不删除,choose=1时,表示删除该元素,释放内存
	void makeHeap();
	void display();
	void sort();                //排序
};


//构造函数
Heap::Heap(int *arr,int n)
{
	heapSize = n;
	for (int i = 0; i < n; i++) heapData.push_back(arr[i]);
	makeHeap();
}

//上溯
void Heap::percolateUp(int index, int value)
{
	int holeIndex = index;
	int parent = (holeIndex - 1) / 2;
	while (holeIndex >0 && heapData[parent]<value)    //**错过
	{
		heapData[holeIndex] = heapData[parent];
		holeIndex = parent;
		parent = (holeIndex - 1) / 2;
	}
	heapData[holeIndex] = value;
}

//调整以holeIndex为根的子树为堆,对应值为value,从上往下
void Heap::adjustHeap(int holeIndex, int value)
{
	int topIndex = holeIndex;
	int rightChild = topIndex * 2 + 2;
	while (rightChild < heapSize)
	{
		if (heapData[rightChild - 1] > heapData[rightChild]) rightChild--;
		heapData[holeIndex]=heapData[rightChild];
		holeIndex = rightChild;
		rightChild = 2 * rightChild + 2;          //找到新的洞节点的右孩子
	}
	if (rightChild == heapSize)
	{
		heapData[holeIndex] = heapData[rightChild - 1];
		holeIndex = rightChild - 1;
	}
	heapData[holeIndex] = value;        //**错过,STL源码剖析里面没有这个
	percolateUp(holeIndex,value);   //上溯调节
}

//往堆中加入一个元素
void Heap::pushHeap(int addValue)
{
	heapData.push_back(addValue);
	++heapSize;
	adjustHeap(heapSize - 1, heapData[heapSize - 1]);
}

//往堆中取出一个元素
void Heap::popHeap(int choose)
{
	int adjustValue = heapData[heapSize-1];
	heapData[heapSize - 1] = heapData[0];     //将第一个放到堆尾;
	--heapSize;
	if (choose==1) heapData.pop_back();
	adjustHeap(0, adjustValue);             //**错过,是从上往下
}

//生成堆
void Heap::makeHeap()
{
	if (heapSize < 2) return;
	int holeIndex = (heapSize - 2) / 2;  //最后一个节点的parent
	while (1)
	{
		adjustHeap(holeIndex, heapData[holeIndex]);
		if (holeIndex == 0) return;
		--holeIndex;
	}
}

//显示堆
void Heap::display()
{
	for (int i = 0; i < heapSize; i++)
		cout << heapData[i] << " ";
	cout << endl;
}

//排序
void Heap::sort()
{
	int temp = heapSize;
	while (heapSize > 0)
		popHeap();
	heapSize = temp;
}
#endif

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

using namespace std;


int main()
{
	int a[9] = {0,1,2,3,4,8,9,3,5};
	Heap heap1(a, 9);
	//heap1.pushHeap(7);
	//heap1.display();
	//heap1.popHeap();
	heap1.sort();
	heap1.display();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值