这个堆的实现采用数组存储的完全二叉树实现。

最近有点烦躁,先是跳槽到了一个外包公司,感觉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实现的更多相关文章

  1. JVM的堆(heap)、栈(stack)和方法区(method)

    JVM主要由类加载器子系统.运行时数据区(内存空间).执行引擎以及与本地方法接口等组成.其中运行时数据区又由方法区Method Area.堆Heap.Java stack.PC寄存器.本地方法栈组成. ...

  2. [转]JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题: 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(h ...

  3. 堆heap和栈Stack(百科)

    堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...

  4. (转)Java里的堆(heap)栈(stack)和方法区(method)(精华帖,多读读)

    [color=red][/color]<一> 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创建,既在栈 ...

  5. Java中堆(heap)和栈(stack)的区别

    简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分 ...

  6. 优先队列Priority Queue和堆Heap

    对COMP20003中的Priority queue部分进行总结.图片来自于COMP20003 queue队列,顾名思义特点先进先出 priority queue优先队列,出来的顺序按照优先级prio ...

  7. python数据结构之堆(heap)

    本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...

  8. 纸上谈兵: 堆 (heap)

    纸上谈兵: 堆 (heap)   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 堆(heap)又被为优先队列(priority ...

  9. JVM 内存初学 堆(heap)、栈(stack)和方法区(method)

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题:先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(he ...

  10. 转:JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    原文地址:JVM 内存初学 (堆(heap).栈(stack)和方法区(method) ) 博主推荐 深入浅出JVM 这本书 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(heap).栈( ...

随机推荐

  1. Lost Cows POJ - 2182 二分 + 树状数组

    Code: #include<cstdio> #include<stack> #include<cstring> #include<algorithm> ...

  2. 路飞学城Python-Day32

    36-进程池线程池 开多线程实现并发的效率是高的,当用户没有那么多的时候,服务器是可以承受压力的 但是一定要以某种方式来设置并发数,让服务器能够实现稳定的运行,控制服务器的线程数 设置池,往里面放池的 ...

  3. Pyhton学习——Day34

    # 任何语言都会发生多线程,会出现不同步的问题,同步锁.死锁.递归锁# 异步: 多任务, 多个任务之间执行没有先后顺序,可以同时运行,执行的先后顺序不会有什么影响,存在的多条运行主线# 同步: 多任务 ...

  4. CF1037E Trips (离线+图上构造)

    题目大意:一共有n个人,每天早上会有两个人成为朋友,朋友关系不具有传递性,晚上,它们会组织旅游,如果一个人去旅游,那么他不少于$k$个朋友也要和他去旅游,求每天的最大旅游人数 一开始并没有想到反向建图 ...

  5. 支持Openflow 1.3的wireshark插件安装教程

    目前为止,我们使用openflow wiki里提供的minient镜像里集成的wireshark只支持openflow1.0,我们通过wireshark上 菜单 help-->about wir ...

  6. JQuery封装ajax的方法

    1.$.post方法 $.post(url[,data][,callback][,type]) url:请求的后台程序地址 data:发送到后台的数据 callback:载入成功时回调函数,该函数参数 ...

  7. js中的json操作

    js中的json操作 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScr ...

  8. md5如何实现encodePassword加密方法

    后台的加密代码:用户名:zhangsan   密码:123 /** * 编译密码,即加密 * @param user 用户信息 * @param password 密码 * @return 返回值为加 ...

  9. POJ2891 Strange Way to Express Integers (扩展欧几里德)

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia 题目大意 求解一组同余方程 x ≡ r1 (mod a1) x ≡ r2 (mod a2) x ≡ r ...

  10. 极路由4pro安装java(Jamvm 2.0.0 + gnu classpath 0.9.8)

    首先试了gnu classpath 0.9.9,编译不过后来改成0.9.8 编译环境 OS: 64位 Ubuntu 16.04 LTS(vmware虚拟机) SDK: 用之前讲过的官方SDKmtmip ...