###### 王晓斌的专栏

Take honour from me and my life is undone.

###### 【数据结构】堆 Heap

1. 堆的定义：

1 父节点的键值总是大于或等于(小于或等于)它的任意一个子节点的键值(顺序性)；

2 堆总是一个完全二叉树；

2. 堆的存储：

{

root 节点索引：1

left child(i)    当前节点i的左子节点索引：2 × i

right child(i) 当前节点i的右子节点索引：2×i + 1

parent(i)       当前节点i的父节点的索引值：i/2

}

3. 堆的操作：

3.1. siftup:

/**
* @param newItem the new inserted item
* @param n       the current index in the array X for the newItem, initially it is the last index of the array + 1
*/
void siftup(T newItem, int n)
{
int currentIndex = n;

for (int parentIndex = ParentIndex(currentIndex); parentIndex > 0 && newItem < X[parentIndex]; )
{
X[currentIndex] = X[parentIndex];
currentIndex = parentIndex;
parentIndex = ParentIndex(parentIndex);
}
}

3.2. siftdown:

/**
* @param n the replaced node index, initially n = 1, replace the root node
* @param newItem the new replaced value on X[n]
*/
void siftdown(int n, T newItem)
{
int currentIndex = n;

// If current node owns child node(s), check
while (getLeftChildIndex(currentIndex) > heapSize)
{
int leftChildIndex = getLeftChildIndex(currentIndex);
int rightChildIndex = getRightChildIndex(currentIndex);

// get the index whose item value is the less one.
int minItemIndex = (rightChildIndex < heapSize) ? (X[leftChildIndex] < X[rightChildIndex] ? leftChildIndex : rightChildIndex) : (leftChildIndex);

if (newItem > X[minItemIndex])
{
X[currentIndex] = X[minItemIndex]; // swap value
currentIndex = minItemIndex;
}else
{
// exit
break;
}
}
X[currentIndex] = newItem;
}

3.3. 堆插入元素insert：

void insert(T newItem)
{
siftUp(newItem, heapSize);
}

3.4. 堆删除元素delete:

T delete()
{
T deletedItem = X[1];

heapSize -= 1;
siftdown(1, X[n]);

return deletedItem;
}

3.5. 堆排序：

void sort()
{
for (int i = n; i > 1; i--)
{
swap(X[1], X[i]);
heapSize -= 1; // reduce the heap size.
siftdown(1, X[1]); // current X[1] is the new value which is the X[i] before the swaption.
}
}

3.6. 堆操作的动态演示：

4. C++ STL中的堆操作：

#### 数据结构-堆（heap）

2016-05-15 20:00:44

#### 数据结构之堆（Heap）的实现

2016-05-24 15:28:10

#### Heap(data structure)——堆（数据结构）（源自维基百科）

2013-12-13 10:56:48

#### 数据结构之堆(Heap)及其用途

2016-12-07 18:57:16

#### C++ 数据结构-堆

2017-08-12 22:35:14

#### 数据结构（C++） —— 最小堆（mainHeap）

2017-02-19 11:22:08

#### 堆这种数据结构 Java实现

2016-03-18 23:40:37

#### JVM Heap堆

2013-12-02 21:56:31

#### Python中的堆数据结构——heap模块

2017-08-08 20:50:06

#### C++中堆和栈（非数据结构的heap and stack）的完全解析

2016-09-10 06:11:38

【数据结构】堆 Heap