堆(Heap)-c实现
这个堆的实现采用数组存储的完全二叉树实现。
最近有点烦躁,先是跳槽到了一个外包公司,感觉2016有点坑,另外一件事就是老婆怀孕了,但是在家里没人照顾,很担心。
这个堆的实现就暂时不优化了,基本的插入,删除实现。
还有,NJ,这个城市真热。
这周希望把剩下的几个数据结构给写了@2016-08-11 00:08:22
#include <stdio.h>
//#define PF printf("____________in Function___________ %s\n", __FUNCTION__)
#define PF
#define HAVETWOSON 1 //表示其有2个子节点
#define HAVEONLYLSON 2 //只有1个左孩子节点
/*堆的实现采用数组,首先是构建完全二叉树的规则
1.完全二叉树的性质
2.子节点的value小于父节点
3.为了保持数组下标和完全二叉树的对应关系,数组下标选择从1开始处理,第1个数组元素置为heap的大小
4.最近比较事多,老婆怀孕,家里没人照顾,好烦躁。这个堆的实现push和pop有好的方法去实现,但是没心情去好好想,就偷懒了,具体的想法就是,push和pop操作的元素只是i,2i, 2i+1,希望有时间来改改吧。
*/
void RevHeap(int *top, int *l, int *r);
int GetMin(int *t, int *l, int *r, int *min);
void PopEle(int *heap);
void PrintBHeapWh(int *top);
void PrintBHeapEl(int *top);
int CheckHeap(int *heap, int pos);
void ConsBHeap(int *heap);
void PushEle(int *heap, int newEle);
void PushEle(int *heap, int newEle)
{
*heap = *heap + ;
*(heap + *heap) = newEle;
}
int GetMin(int *t, int *l, int *r, int *min)
{
PF;
//min = (int *)malloc(sizeof(int));
*min = *t;
if(*min > *l)
{
*min = *l;
}
if(*min > *r)
{
*min = *r;
}
if(*min == *l)
{
return ;
}
else if(*min == *r)
{
return ;
}else
{// min = *t
return ;
}
}
void PopEle(int *heap)
{
//PF;
*(heap+) = *(heap + *heap);
--(*heap);
}
void PrintBHeapWh(int *top)
{
//PF;
int i ;
for(i=; i<*top+; i++)
{
printf("%d ", *(top+i));
}
printf("\n");
}
void PrintBHeapEl(int *top)
{
//PF;
int i ;
for(i=; i<*top+; i++)
{
printf("%d ", *(top+i));
}
printf("\n");
}
void RevHeap(int *top, int *l, int *r)
{
int *min = NULL;
min = (int *)malloc(sizeof(int));
int ret = -;
int tmp;
if(r != NULL)
{
ret = GetMin(top, l, r, min);
if(ret ==)
{
//l is the min
tmp = *top;
*top = *l;
*l = tmp;
}
else if(ret ==)
{
tmp = *top;
*top = *r;
*r = tmp;
}
}
else
{
*min = *top;
if(*min > *l)
{
tmp = *l;
*l =*min;
*min = tmp;
}
*top = *min;
}
return ;
}
int CheckHeap(int *heap, int pos)
{
//PF;
if(pos*+ <= *heap)
{
if((*(heap +pos) > *(heap + pos*))
|| (*(heap +pos) > *(heap + pos*+)))
{
return HAVETWOSON;
}
}
//只有左子树
//if((pos*2 <= size)&&(pos*2+1 > size))
if((pos* == *heap))
{
if(*(heap +pos) > *(heap + pos*))
// || (*heap +pos > *heap + pos*2+1))
{
return HAVEONLYLSON;
}
}
return ;
}
void ConsBHeap(int *heap)
{
PF;
int i ;
int isNeedCon = ;
for(i = ; i < *heap+; i++)
{
if(CheckHeap(heap, i)==HAVETWOSON)
{
//printf("proc [%d]th elem [%d]\n", i, *(heap+i));
RevHeap(heap +i, (heap + *i), (heap+ *i+));
//printf("i=[%d] %d %d %d \n", i, *(heap+i), *(heap + 2*i), *(heap+ 2*i+1));
isNeedCon = ;
}
else if(CheckHeap(heap, i)== HAVEONLYLSON)
{
RevHeap(heap+i, (heap + *i), NULL);
//printf("i=[%d] %d %d \n", i, *(heap+i), *(heap + 2*i) );
isNeedCon = ;
}
//printf("[%d]th change.", i);
//PrintBHeapEl(heap);
}
printf("\n");
//用递归好写,偷点懒
if(isNeedCon)
{
ConsBHeap(heap);
}
return;
}
int main(void)
{
//int arr[12]={0,4, 5, 2, 1,3, 6, 8, 9, 7, 22, 11};
int arr[]={, , , , ,, };
//PrintBHeapEl(arr);
printf("Berfore process the heap:\n");
PrintBHeapWh(arr);
ConsBHeap(arr);
printf("Consturcct the heap:\n");
PrintBHeapWh(arr);
PopEle(arr);
printf("Pop the heap:\n");
PrintBHeapWh(arr);
ConsBHeap(arr);
printf("Pop Con the heap:\n");
PrintBHeapWh(arr);
PushEle(arr, );
printf("Pop the heap:\n");
PrintBHeapWh(arr);
ConsBHeap(arr);
printf("Push Con the heap:\n");
PrintBHeapWh(arr);
return ;
}
运行结果贴下:
Berfore process the heap:
6 4 5 2 1 3 6
Consturcct the heap:
6 1 2 4 5 3 6
Pop the heap:
5 6 2 4 5 3
Pop Con the heap:
5 2 3 4 5 6
Pop the heap:
6 2 3 4 5 6 1
Push Con the heap:
6 1 3 2 5 6 4
堆(Heap)-c实现的更多相关文章
- JVM的堆(heap)、栈(stack)和方法区(method)
JVM主要由类加载器子系统.运行时数据区(内存空间).执行引擎以及与本地方法接口等组成.其中运行时数据区又由方法区Method Area.堆Heap.Java stack.PC寄存器.本地方法栈组成. ...
- [转]JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )
这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题: 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(h ...
- 堆heap和栈Stack(百科)
堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...
- (转)Java里的堆(heap)栈(stack)和方法区(method)(精华帖,多读读)
[color=red][/color]<一> 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收. 引用数据类型,需要用new来创建,既在栈 ...
- Java中堆(heap)和栈(stack)的区别
简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分 ...
- 优先队列Priority Queue和堆Heap
对COMP20003中的Priority queue部分进行总结.图片来自于COMP20003 queue队列,顾名思义特点先进先出 priority queue优先队列,出来的顺序按照优先级prio ...
- python数据结构之堆(heap)
本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...
- 纸上谈兵: 堆 (heap)
纸上谈兵: 堆 (heap) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 堆(heap)又被为优先队列(priority ...
- JVM 内存初学 堆(heap)、栈(stack)和方法区(method)
这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题:先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(he ...
- 转:JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )
原文地址:JVM 内存初学 (堆(heap).栈(stack)和方法区(method) ) 博主推荐 深入浅出JVM 这本书 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(heap).栈( ...
随机推荐
- BZOJ2179: FFT快速傅立叶 FFT实现高精度乘法
Code: #include <cstdio> #include <algorithm> #include <cmath> #include <cstring ...
- IDEA Maven 打包运行 jar java.io.FileNotFoundException: 问题?
当 使用 idea maven 将项目打包运行的时候,能够成功运行,但是总会跑到 xxx\xxx\lib 下 找jar包 如下异常: java.io.FileNotFoundException: D: ...
- POJ 1185 炮兵阵地 (状压dp)(棋盘dp)
这题和poj 3254很像,但是更复杂了一些 都属于棋盘里放东西,然后又各种各样的限制,然后求方案或者最大值 (1)上一道题距离要大于1,这道题是大于2.所以判断的时候变成 !(x & (x ...
- springboot项目封装为docker镜像
1.本次镜像的基础镜像是:https://www.cnblogs.com/JoeyWong/p/9173265.html 2.将打包好的项目文件放在与Dockerfile同级的目录下 3.Docker ...
- MyBatis学习总结(8)——Mybatis3.x与Spring4.x整合
一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...
- POJ——T1679 The Unique MST
http://poj.org/problem?id=1679 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 30120 ...
- 极路由设置共享磁盘密码、跨网访问samba服务
极路由插上移动硬盘后会自动建立samba服务器,但我们没法去配置哪些盘符需要密码,这样只要在同一个wifi下的电脑都能去访问这些东西了,比较弱智.另外我还想再公司中去读写这个移动硬盘. 设置密码 首先 ...
- 2014百度之星资格赛—— Xor Sum(01字典树)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- C++中对字符串进行插入、替换、删除操作
#include <iostream> #include <string> using std::cout; using std::endl; using std::strin ...
- Effective Java(一)—— 创建和销毁对象
在客户端(调用端)获取自身实例的方法: 公有的构造器: 类的静态工厂方法: 1. 使用静态工厂方法代替构造器 Boolean 是对基本类型 boolean 的包装类: public final cla ...