笔记:堆的增删改查(数组实现)

来源:互联网 发布:宁波大学网络注销 编辑:程序博客网 时间:2024/06/11 03:38

思路:增的话在数组最后增加,依次找他的父节点并比较满足直接跳出,不满足交换,并将父节点赋值给当前节点,一次往上比较,直到找完

         删的话首先只能删除堆顶,即将尾节点的值赋给根节点,Len--,然后将新的堆顶依次和子节点比较,满足则跳出,不满足交换,并更改当前节点,一次往下比较,直到越界,

         初始化的话就简单了,从最后一个有子节点的父节点,执行删除的的循环比较操作,直到当前节点变为零,跳出外循环.

#include<iostream>

using namespace std;
class MyHead
{
int * Buff;
unsigned Len;
unsigned MaxSize;
public:
MyHead();
~MyHead();
void Delete();
void Clear();
void Append(int data);
void Initialize(int*arr,int L);
int GetBuffTop()
{
return Buff[0];
}
};
void MyHead::Clear()
{
if (Buff)
{
delete[]Buff;
Buff = NULL;
Len = 0;
MaxSize = 0;
}
}
MyHead::MyHead()
{
Buff = NULL;
Len = MaxSize = 0;
}
MyHead::~MyHead()
{
Clear();
}
void MyHead::Delete()
{
if (Buff)
{
if (Len > 1)
{
unsigned index = 0;
unsigned Endindex = Len - 1;
Buff[index] = Buff[Endindex];
while (true)
{
unsigned Left = index * 2 + 1;
unsigned Right = index * 2 + 2;
if (Left>Len-1)
break;
bool isLeft = true;
if (Right <= Len-1&&Buff[Left] < Buff[Right])
{
isLeft = false;
}
if (isLeft)
{
if (Buff[Left]>Buff[index])
{
int temp = Buff[Left];
Buff[Left] = Buff[index];
Buff[index] = temp;
index = Left;
}
else
break;
}
else
{
if (Buff[Right] > Buff[index])
{
int temp = Buff[Right];
Buff[Right] = Buff[index];
Buff[index] = temp;
index = Right;
}
else
break;
}
}
}
Len--;
}
}
void MyHead::Append(int data)
{
if (Len >= MaxSize)
{
int* TempBuff = new int[MaxSize = MaxSize +( (MaxSize >> 1) > 1 ? MaxSize : 1)];
memmove(TempBuff, Buff, sizeof(int)*Len);
if (Buff)
{
delete[]Buff;
Buff = NULL;
}
Buff = TempBuff;
}
Buff[Len++] = data;
unsigned index = Len - 1;
while (index)
{
unsigned tempindex = (index - 1) >> 1;
if (Buff[index] > Buff[tempindex])
{
int temp = Buff[index];
Buff[index] = Buff[tempindex];
Buff[tempindex] = temp;
}
else
break;
index = tempindex;
}
}
void MyHead::Initialize(int*arr,int L )
{
if (Buff)
Clear();
Buff = new int[L];
Len = MaxSize = L;
memmove(Buff, arr, sizeof(int)*L);
for (int i =( (Len - 2) >> 1); i >= 0 ; i--)
{
int index = i;
while (true)
{
unsigned Left = index * 2 + 1;
unsigned Right = index * 2 + 2;
if (Left>Len - 1)
break;
bool isLeft = true;
if (Right <= Len - 1 && Buff[Left] < Buff[Right])
{
isLeft = false;
}
if (isLeft)
{
if (Buff[Left]>Buff[index])
{
int temp = Buff[Left];
Buff[Left] = Buff[index];
Buff[index] = temp;
index = Left;
}
else
break;
}
else
{
if (Buff[Right] > Buff[index])
{
int temp = Buff[Right];
Buff[Right] = Buff[index];
Buff[index] = temp;
index = Right;
}
else
break;
}
}
}

}

#include"MyHead.h"
int main()
{
MyHead a;
int arr[] = { 1, 89, 45, 63, 2, 1, 0, 15, 10, 7 };
//for (unsigned i = 0; i < 10; ++i)
//{
// a.Append(arr[i]);
//}
a.Initialize(arr, 10);
for (unsigned i = 0; i < 10; ++i)
{
cout << a.GetBuffTop() << endl;
a.Delete();
}
system("pause");
return 0;
}#include"MyHead.h"
int main()
{
MyHead a;
int arr[] = { 1, 89, 45, 63, 2, 1, 0, 15, 10, 7 };
//for (unsigned i = 0; i < 10; ++i)
//{
// a.Append(arr[i]);
//}
a.Initialize(arr, 10);
for (unsigned i = 0; i < 10; ++i)
{
cout << a.GetBuffTop() << endl;
a.Delete();
}
system("pause");
return 0;
}


原创粉丝点击