构建小堆
插入数据:
bool Insert(T val)
{
if (!m_data)
Init();
int i;
for (i = ++m_nPos; val < m_data[GetFatherID(i)]; i /= 2)//if insert data < father
m_data[i] = m_data[GetFatherID(i)];
m_data[i] = val;
return true;
}
1:for 循环从对的最后一个元素开始,并且数组总数+1.
2:插入的元素为当前元素,当插入的元素小于它的父节点时,将父节点赋值给子节点(相当于父节点下滤),继续判断父节点的父节点。
3:直到元素的父节点大于或者等于插入的元素。循环退出,将插入的元素赋值给该节点。
删除元素:(下滤)
T Delete()
{
cout << "delete min data:";
T mindata = m_data[1];
T lastadata = m_data[m_nPos--];
int i = 0;
int nchild;
for (i = 1; i * 2 < m_nPos; i=nchild)
{
nchild = i * 2;
if (m_data[nchild + 1] < m_data[nchild])//get min son
{
nchild++;
}
if (m_data[nchild] < lastadata)//if son < lastdata
{
m_data[i] = m_data[nchild];
}
else
{
break;
}
}
m_data[i] = lastadata;
return mindata;
}
1:找到第一个元素(最小元素)和最后一个元素。
2:从第一个元素开始遍历,第一个元素为当前元素。
3:找到当前元素的孩子中最小的元素。
4:如果该元素的最小的孩子小于最后一个元素,将该元素上冒(将子节点赋值给父亲),否则退出循环
5:找到该节点,将最后一个元素赋值给该节点。