堆(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).栈( ...
随机推荐
- zookeeper+kafka集群搭建
一.ZK集群安装. 解压安装包后进入conf目录,conf/zoo_sample.cfg拷贝一份命名为zoo.cfg,同时也放在conf下面. zookeeper配置文件: # The number ...
- 关于背景颜色、TEXT、<b>、<i>、<u>、<br>、< >、<br>、<br>、h1-h6、<span>、<div>、<ol>、<ul>、<a>标签的用法(下载、跳转、锚点)、Img插入的用法
<html> <head> <meta charset="UTF-8"> <title></ ...
- PHP SOAP如何传入复杂对象
Paymentexpress有一个SOAP服务方法Check3dsEnrollment(String username,String password, EnrolmentCheckRequest t ...
- Spring项目配置log4j日志功能
一,添加log4j依赖包 可从官网上下载该依赖包log4j-x.x.xx.jar,下载后 build path,添加依赖包如使用maven,可以添加如下依赖 <!-- https://mvnre ...
- POJ 2661Factstone Benchmark(斯特林公式)
链接:传送门 题意:一个人自命不凡,他从1960年开始每10年更新一次计算机的最长储存长数.1960年为4位,每10年翻一倍.给出一个年份y,问这一年计算机可以执行的n!而不溢出的最大n值 思路:如果 ...
- 2019-03-15 使用Request POST获取中加基金的PDF文件,并下载到本地
import requests import time base_url='http://www.bobbns.com/common-web/cms/content!getContentsInclud ...
- nignx 502错误不能使用/的路径方式 即pathinfo
在server中加入 include enable-php-pathinfo.conf; 引入nginx.conf下的这个文件即可. 如果是tp框架,主要隐藏index.php的入口文件,再加入下面这 ...
- linux部分常用命令
linux的命令挺多的,下面是我常用的,其实也不可能在敲代码的时候把这个博客拿出来对着写,就是想记录一下,刚开始都觉得不好记,多敲几遍就记住了!!! 创建文件夹:mkdir filename 删除当前 ...
- 【BZOJ 1486】 [HNOI2009]最小圈
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 我们可以只想那个均值最小的环. 我们不知道那个环由哪些边构成 但我们可以把每条边都减掉mid 那个环受到的影响是什么呢? 如果这个均 ...
- HDU 4324 Contest 3
直接DFS即可 #include <iostream> #include <string.h> #include <algorithm> #include < ...