堆(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).栈( ...
随机推荐
- JS怎样计算过关分数
一个游戏,前20关是每一关自身的分数,//21-30关每一关是10分//31-40关,每一关是20分//41-49关,每一关是30分//50关,是100分 <!DOCTYPE html> ...
- NuSOAP笔记:如何创建复杂数据类型
PHP已经有了内置的SOAP扩展,但是它不具备自动生成WSDL的能力,所以很多时候,NuSOAP还是有一定诱惑力的. 在应用稍微复杂点的时候,单靠integer, string等简单数据类型是不能满足 ...
- HDU 2842 Chinese Rings( 递推关系式 + 矩阵快速幂 )
链接:传送门 题意:解 N 连环最少步数 % 200907 思路:对于 N 连环来说,解 N 连环首先得先解 N-2 连环然后接着解第 N 个环,然后再将前面 N-2 个环放到棍子上,然后 N 连环问 ...
- 修改Myeclies作者用户名
首先点击 windos 点击 preferences 依次点击左侧 Java -> Code Style -> Code Templates 击右侧Comments,将其中的Types项, ...
- 【codeforces 505D】Mr. Kitayuta's Technology
[题目链接]:http://codeforces.com/problemset/problem/505/D [题意] 让你构造一张有向图; n个点; 以及所要求的m对联通关系(xi,yi) 即要求这张 ...
- shell 脚本 helloworld
一.Hello World 脚本代码 #!/bin/sh echo "hello world" /bin/pwd 二.分析脚本 第 1 行:shell 脚本的固定写法 第 2 行: ...
- HDU 4320 Contest 3
只需A的全部质因数包含在B中即可. #include <iostream> #include <cstdio> #define LL __int64 #include < ...
- POJ 3695
可以用容斥原理来求.求两个矩形的并的时候可以使用条件 x1=max(p.x1,q.x1);y1=max(p.y1,q.y1);x2=min(p.x2,q.x2);y2=min(p.y2,q.y2); ...
- Android高级控件(一)——ListView绑定CheckBox实现全选,添加和删除等功能
Android高级控件(一)--ListView绑定CheckBox实现全选,添加和删除等功能 这个控件还是挺复杂的.也是项目中应该算是比較经常使用的了,所以写了一个小Demo来讲讲,主要是自己定义a ...
- spring web mvc第一天
spring web mvc 感觉就是高大上啊!啥都是配置文件就能够了.所以第一步就是弄清楚配置文件使用和总体框架的流程! Spring web mvc最重要的当然是Controller,也就是首先 ...