数据结构学习——二叉堆ADT(程序化)

参考书籍《数据结构与算法分析——C语言描述》

关于堆的一些基本概念,可参见小zz的另一篇博文。

/*本例程实现的是最小堆,最大堆类似*/
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>

#define MAX 13

typedef struct BHeap
{
    int Capacity;//堆的最大容量
    int Size;//当前堆大小
    int *bh;//堆的数组实现
}BHeap,*BH;

BH Init_BH(int Max);//堆的初始化
bool IsFull(BH H);//判断堆是否满
void Insert(int data,BH H);//插入操作
int DeletMin(BH H);//删除最小元
bool IsEmpty(BH H);//判断是否是空
void PrintHeap(BH H);

int main()
{
    int i=0;
    int data[11]={0,14,19,26,65,32,31,21,68,16,13};
    BH Heap;
    Heap=Init_BH(MAX);
    for(i=1;i<=10;i++)
    {
        Insert(data[i],Heap);
    }
    PrintHeap(Heap);
    DeletMin(Heap);
    PrintHeap(Heap);

    return 0;
}

BH Init_BH(int Max)
{
    BH H;
    H=malloc(sizeof(BHeap));
    if(H==NULL)
        printf("Out of space!\n");

    H->bh=malloc(sizeof(int)*(Max+1));
    memset(H->bh,0,sizeof(int)*(Max+1));
    if(H->bh==NULL)
        printf("Out of space!\n");

    H->Capacity=Max;
    H->Size=0;
    H->bh[0]=0;

    return H;
}

bool IsFull(BH H)
{
    if(H->Capacity==H->Size)
        return true;//已满
    else return false;//未满
}

void Insert(int data,BH H)
{
    int i;
    if(IsFull(H))
    {
        printf("Binary Heap is full!\n");
        return;
    }

    for(i=++H->Size;H->bh[i/2]>data;i=i/2)//上滤
    {
            H->bh[i]=H->bh[i/2];
    }
    H->bh[i]=data;
}

bool IsEmpty(BH H)
{
    if(H->Size==0)
        return true;//空堆
    else return false;
}

int DeletMin(BH H)
{
    int i,Child;
    int Min,Last;
    if(IsEmpty(H))
    {
        printf("Heap is empty!\n");
        return H->bh[0];
    }

    Min=H->bh[1];
    Last=H->bh[H->Size--];

    for(i=1;i*2<=H->Size;i=Child)
    {
        Child=i*2;//左儿子
        if((Child<H->Size)&&(H->bh[Child]>H->bh[Child+1]))
            Child++;
        if(Last>H->bh[Child])
            H->bh[i]=H->bh[Child];
        else
            break;
    }
    H->bh[i]=Last;
    return Min;
}

void PrintHeap(BH H)
{
    int i=0;
    for(i=1;i<=H->Size;i++)
    {
        printf("%d\t",H->bh[i]);
    }
}
时间: 2024-11-11 11:12:08

数据结构学习——二叉堆ADT(程序化)的相关文章

D&amp;F学数据结构系列——二叉堆

二叉堆(binary heap) 二叉堆数据结构是一种数组对象,它可以被视为一棵完全二叉树.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.对于数组中任意位置i上的元素,其左儿子在位置2i上,右儿子在左儿子后的单元2i+1中,它的父亲在[i/2](向下取整)中. 因此,一个数据结构将由一个数组.一个代表最大值的整数.以及当前的堆的大小组成.一个典型的优先队列(priority queue)如下: 1 #ifndef _BinHeap_H 2 struct HeapStruct; 3 type

【数据结构】二叉堆

看到一篇很好的博文,来自http://blog.csdn.net/morewindows/article/details/6709644 下面是博文内容 堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆).

优先队列 - 数据结构 (二叉堆)

优先队列包括二叉堆.d-堆.左式堆.斜堆.二项队列等 1.二叉堆 堆是一棵被完全填满的二叉树,有可能例外的是在底层,底层上的元素从左到右填入.这样的树称为完全二叉树. 堆序的性质:在一个堆中,对于每一个节点X,X的父亲的关键字小于(或等于)X中的关键字,根节点除外(它没有父节点).完全二叉树可以用数组实现. //关于二叉堆的头文件定义 如果要插入的元素是新的最小值,那么它将一直被推向堆顶.这样在某一个时刻,i将是1,我们就需要另Insert函数令程序跳出while循环,这个值必须保证小于或者至少

数据结构 之 二叉堆(Heap)

注:本节主要讨论最大堆(最小堆同理). 一.堆的概念 堆,又称二叉堆.同二叉查找树一样,堆也有两个性质,即结构性和堆序性. 1.结构性质: 堆是一棵被全然填满的二叉树.有可能的例外是在底层.底层上的元素从左到右填入.这种树称为全然二叉树(complete binary tree).下图就是这样一个样例. 对于全然二叉树,有这样一些性质: (1).一棵高h的全然二叉树,其包括2^h ~ (2^(h+1) - 1)个节点.也就是说.全然二叉树的高是[logN],显然它是O(logN). (2).全然

数据结构之二叉堆、堆排序

前言 上一篇写了数据结构之二叉搜索树.AVL自平衡树,这次来写堆. 堆的创造者 很久以前排序算法的时间复杂度一直是O(n^2), 当时学术界充斥着"排序算法不可能突破O(n^2)"的声音,直到1959年,由D.L.Shell提出了一种排序算法,希尔排序(Shell Sort),才打破了这种不可能的声音,把排序算法的时间复杂度提升到了O(n^3/2)! 当科学家们知道这种"不可能"被突破之后,又相继有了更快的排序算法,"不可能超越O(n^2)"彻底

数据结构之二叉堆(构建堆,堆排序)-(七)

/* * @author Lip * @date 2015-04-23 */ public class Heap { public static void main(String[] args) { // TODO Auto-generated method stub //System.out.println((int)-1.5); int []array={4,2,7,9,3,6,1,12,10,5}; System.out.println("原始:"); printHeapByLe

【笔记】【数据结构】二叉堆

作用: 插入元素,O(lgN) 修改元素,O(lgN) 删除元素,O(lgN) 查询元素,O(1) 动态查询最值,O(NlgN)-O(lgN)-O(1) 核心操作: 上浮与下沉 最小堆:上浮是指较小值上浮,下沉是指较大值下沉. 最大堆:上浮是指较大值上浮,下沉是指较小值下沉. 具体操作: 预处理中,对所有的根节点下沉操作,即交换根节点与一个较小的子节点,然后接着将子节点作为根节点,进行下一次下沉操作. 插入元素时,将它放入最底层,并不断地上浮. 删除堆顶元素时,将堆顶元素与最后一个元素交换,然后

《数据结构与算法分析:C语言描述》复习——第五章“堆”——二叉堆

2014.06.15 22:14 简介: 堆是一种非常实用的数据结构,其中以二叉堆最为常用.二叉堆可以看作一棵完全二叉树,每个节点的键值都大于(小于)其子节点,但左右孩子之间不需要有序.我们关心的通常只有堆顶的元素,而整个堆则被封装起来,保存在一个数组中. 图示: 下图是一个最大堆: 实现: 优先队列是STL中最常用的工具之一,许多算法的优化都要利用堆,使用的工具就是优先队列.STL中的优先队列通过仿函数来定义比较算法,此处我偷懒用了“<”运算符.关于使用仿函数的好处,我之后如果有时间深入学习S

算法学习 - 优先队列的二叉堆实现

PriorityQuenue 优先队列就是作业调度类的ADT,这里用二叉堆来实现. 优先队列最少有两个操作:插入(Insert)和删除最小者(DeleteMin). 插入操作图解: 图片来源:www.educity.cn 删除操作图解: 图片来源:www.cfanz.cn 代码实现: // // main.cpp // binaryHeap // // Created by Alps on 14-8-17. // Copyright (c) 2014年 chen. All rights rese