笔记:堆的增删改查(数组实现)
来源:互联网 发布:宁波大学网络注销 编辑:程序博客网 时间: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;
}
- 笔记:堆的增删改查(数组实现)
- java实现数组的增删改查
- 数组的增删改查
- 黑马程序员------学习笔记(1)数组实现班内学生的增删改查操作
- 数组的增删改查的C语言实现
- 数据结构之数组的增删改查-java实现
- 使用移动数组下标的方式实现增删改查
- JS数组操作之增删改查的简单实现
- java创建数组,实现增删改查
- java 利用数组实现增删改查
- MVC学习笔记二:实现简单的增删改查
- Hibernate 笔记4 实现对数据库的增删改查
- Hibernate 笔记 实现对数据库的增删改查
- Hibernate 笔记4 实现对数据库的增删改查
- 自定义数组的增删改查
- 多维数组的运用 增删改查
- 数组的增删改查操作
- 数据结构JAVA数组的增删改查
- noip2013day1
- Android中使用数据库保存数据
- Redis--persistence(持久化)
- hdu6154
- iOS 数据结构~链表简介
- 笔记:堆的增删改查(数组实现)
- SpringMVC 注解开发
- Linux部署web程序
- nodgd 好路线 noip 2015 模拟赛 T3
- 关于局域网内多人通过IP连接同一个sql数据库的问题
- 原码,反码,补码详解
- 辗转相除法求最大公约数
- hdu6153(kmp) A Secret
- Linux Centos6.8 安装配置MongoDB-3.4.0