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