堆的一些基本操作實現

//關於建堆和對其的一些操作
#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();
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章