构建小堆

插入数据:

	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:找到该节点,将最后一个元素赋值给该节点。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值