最大堆(最小堆)是一个二叉完全树,节点的子节点i的下表为2*i+1,2*i+2
插入过程:插入到数组末尾,然后逐层向上开始调整。
删除:通常删除根节点,将根节点和末尾节点交换后,从根节点向下调整。
插入过程:插入到数组末尾,然后逐层向上开始调整。
删除:通常删除根节点,将根节点和末尾节点交换后,从根节点向下调整。
排序:升序排序 ---> 最大堆 :每次将尾部节点和根节点交换,堆长度减1,从根节点向下调整,堆长度减为1时排序结束!
/*************************************************************************
> File Name: miniHeap.cpp
> Author: ltf
> Mail: @qq.com
> Created Time: Mon 28 Mar 2016 04:32:23 PM CST
************************************************************************/
#include<iostream>
using namespace std;
int heapSize = 0; // 堆的大小
int heap[100];
//[start,end]
// 从start到end开始向下调整
void siftDown(int start,int end)
{
int j = start;
int i = 2*start+1;
while(i <= end)
{
// find the min one
i =(i<end)&&(heap[i] > heap[i+1])? i+1:i;
if(heap[j] > heap[i])
{
swap(heap[i],heap[j]);
i = j*2+1;
}
else
break;
}
}
// 从第start元素开始向上调整
void siftUp(int start)
{
int i = start;
// -1/2=0 --> i>0
while(i > 0)
{
i = (i-1)/2;
if(heap[i] <= heap[start])
break;
else
{
swap(heap[i],heap[start]);
start = i;
}
}
}
void insertElement(int value)
{
heap[heapSize] = value;
heapSize++;
siftUp(heapSize-1);
}
bool deleteElement(int &value)
{
if(heapSize == 0)
return false;
value = heap[0];
heap[0] = heap[heapSize-1];
heapSize--;
siftDown(0,heapSize-1);
}
void print()
{
int i;
for(i=0;i < heapSize;i++)
cout << heap[i] <<" ";
cout << endl;
}
//minHeap sort increase
void heapSort()
{
int i = heapSize-1;
while(i>0)
{
swap(heap[0],heap[i]);
siftDown(0,i-1);
i--;
}
}
int main()
{
int value = 0;
cout << "input the heap elements,end with 0" << endl;
for(;;)
{
cin >> value;
if(value != 0)
insertElement(value);
else
break;
}
print();
cout << "after delete:" << endl;
deleteElement(value);
cout << value << "(deleted)";
print();
heapSort();
cout << "after sorted:" << endl;
print();
return 0;
}