堆的一些基本操作实现

//关于建堆和对其的一些操作
#include <iostream>
#include <algorithm>
using namespace std;

const int maxn=100;

int heap[maxn],n=10;//将第一个结点储存在数组的一号位 

//函数功能:对heap数组在low到high的范围内向下调整
void downAdjust(int low,int high)
{
	int i=low,j=i*2;//i为想要调整的结点,j为其左孩子
	while(j<=high)
	{
		if(j+1<=high&&heap[j+1]<heap[j])//寻找左右孩子中最小的一个 
		{
			j=j+1;
		}
		if(heap[j]<heap[i])
		{
			swap(heap[j],heap[i]);
			i=j;//更新需要调整的结点
			j=i*2; 
		}
		else
		{
			break;//说明孩子的权值都比想要调整的结点大,调整结束 
		}
	} 
} 

//建堆 时间复杂度为O(n) 
void createHeap()
{
	for(int i=n/2;i>=1;i--)//从最后一个分支结点到根结点逐层遍历 
	{
		downAdjust(i,n);
	}
}

//删除堆顶元素,时间复杂度为log(n) 
void deleteTop()
{
	heap[1]=heap[n--];//使用最后一个元素覆盖堆顶的元素,然后让总个数-1
	downAdjust(1,n);
} 

//删除任意的元素
void deleteRandom(int i)
{
	heap[i]=heap[n--];
	downAdjust(i,n);
} 

//如果想要添加元素,可以把元素放在数组尾部,不断和父节点比较,直到比父节点大或者到达根结点
//这里需要向上调整
void upAdjust(int low,int high)
{
	int i=high,j=i/2;//i始终记录的是需要调整的结点 
	while(j>=low)
	{
		if(heap[j]>heap[i])//当父权较大的时候需要调整
		{
			swap(heap[j],heap[i]);
			i=j;
			j=i/2; 
		} 
		else
		{
			break;//说明本来就只一个堆不需要调整 
		}
	}
} 

//添加元素
void insert(int x)
{
	heap[++n]=x;
	upAdjust(1,n);
} 

void printH()
{
	for(int i=1;i<=n;i++)
	{
		cout<<heap[i]<<" ";
	}
	cout<<endl;
}

void heapSort()//排完序之后数组就是从大到小排列的了 
{
	createHeap();
	for(int i=n;i>1;i--)
	{
		swap(heap[i],heap[1]);
		downAdjust(1,i-1);
	}
}


int main()
{
	heap[0]=0;heap[1]=1;heap[2]=3;heap[3]=6;heap[4]=4;heap[5]=2;heap[6]=7;heap[7]=8;heap[8]=5;heap[9]=10;heap[10]=9;
	createHeap();
	printH();
	deleteRandom(2);
	printH();
	heapSort();
	printH();
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章