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