当前位置: 首页 > news >正文

优先级队列(大顶堆)

为什么80%的码农都做不了架构师?>>>   hot3.png

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MinPQsize 10
#define MaxData 32768
struct heapStruct
{
    int capacity;
    int size;
    int *eles;
};

typedef struct heapStruct *priorityQueue;
priorityQueue initialize(int Maxelements)
{
    priorityQueue H;
    if (Maxelements < MinPQsize)
    {
        printf("Priority Queue size is too small");
        exit(1);
    } 
    H= (priorityQueue)malloc(sizeof(struct heapStruct));
    if (H == NULL)
        exit(1);
        
    /* allocate the array plus one extra for sentinel */
    H->eles = (int *)malloc((Maxelements + 1) * sizeof(int));
    if (H->eles == NULL)
        exit(1);
        
    memset(H->eles, 0, (Maxelements + 1) * sizeof(int));
    
    H->capacity = Maxelements;
    H->size = 0;
    H->eles[0] = MaxData;
    return H;
} 

bool isFull(priorityQueue H)
{
    return H->size == H->capacity;
}

bool isEmpty(priorityQueue H)
{
    return H->size == 0;
}

void destroy(priorityQueue H)
{
    free(H->eles);
    free(H);
} 

/* H->eles[0] is a sentinel */

/* push heap */
/*    将最大值调整到第一个H->eles[1]     */
void insert(int X, priorityQueue H)
{
    int i;
    if (isFull(H))
    {
        printf("Priority queue is full");
        exit(1);
    }
    for ( i = ++H->size; H->eles[i / 2] < X; i /= 2)
        H->eles[i] = H->eles[i / 2];
    H->eles[i] = X;
}

/* pop heap */
int deleteMax(priorityQueue H)
{
    int i, child;
    int MaxElement, LastElement;
    if (isEmpty(H))
    {
        printf("priority queue is empty");
        exit(1);
    } 
    
    MaxElement = H->eles[1];
    LastElement = H->eles[H->size--];
    
    for (i = 1; i * 2 <= H->size; i = child)
    {
        /* find bigger child */
        child = i * 2;
        if (child != H->size - 1 && H->eles[child + 1] > H->eles[child])
            child++;
        /* precolate one level */
        if (LastElement < H->eles[child])
            H->eles[i] = H->eles[child];
        else
            break;
    } 
    H->eles[i] = LastElement;
    return MaxElement;
} 

#define leftChild(i) (2*(i) + 1)
void percolate(int *arr, int i, int N)
{
    int tmp, child;

    for (tmp = arr[i]; leftChild(i) < N; i = child)
    {
        child = leftChild(i);
        if (child != N - 1 && arr[child + 1] > arr[child])
            child++;
   
        if (arr[child] > tmp)
            arr[i] = arr[child];
        else
            break;
    }

    arr[i] = tmp;
}

// 将一段现有数据转化为一个heap
void make_heap(int *arr, int N)
{
    for (int i = N / 2; i >= 0; i--)
    percolate(arr, i, N);
}

int main(void)
{
    int arr[] = {3, 2, 1, 4, 5, 6, 7, 16, 15, 14, 13, 12, 11, 10, 8, 9};
    priorityQueue T = NULL;
    
    T = initialize(20);
    int i;
    
    for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
        insert(arr[i], T);
        
    for (i = sizeof(arr) / sizeof(arr[0]); i > 0; i--)
            arr[i - 1] = deleteMax(T); //不断对heap进行pop操作,便可达到排序效果sort_heap
            
    for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
        printf("%d ", arr[i]);
    printf("\n");
    int arr2[] = {15, 2, 7, 20, 32, 28, 18, 34};
    make_heap(arr2, sizeof(arr2) / sizeof(arr2[0]));
    for (i = 0; i < sizeof(arr2) / sizeof(arr2[0]); i++)
        printf("%d ", arr2[i]);
    return 0;
}





转载于:https://my.oschina.net/manmao/blog/600134

相关文章:

  • orm2 中文文档 3.1 模型属性
  • 点击复选框添加或删除value值到input输入框中
  • Android Property Animation属性动画:rotation旋转(2)
  • linux上很方便的上传下载文件工具rz和sz使用介绍
  • 2016.1.13 随笔
  • JMeter基础之一 一个简单的性能测试
  • [Java开发之路](14)反射机制
  • MDEV Primer
  • 闹心的变量
  • [转载]项目风险管理七种武器-碧玉刀
  • 会声会影简易相册制作教程
  • Spark学习之基于MLlib的机器学习
  • zabbix在centos6下的编译安装
  • C语言 百炼成钢1
  • 【Linux】环境变量设置
  • [NodeJS] 关于Buffer
  • 【刷算法】从上往下打印二叉树
  • Angular Elements 及其运作原理
  • create-react-app做的留言板
  • iOS小技巧之UIImagePickerController实现头像选择
  • Laravel 中的一个后期静态绑定
  • Shell编程
  • unity如何实现一个固定宽度的orthagraphic相机
  • Vue2.x学习三:事件处理生命周期钩子
  • 阿里研究院入选中国企业智库系统影响力榜
  • 解析 Webpack中import、require、按需加载的执行过程
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 通过git安装npm私有模块
  • 通过几道题目学习二叉搜索树
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​【已解决】npm install​卡主不动的情况
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $GOPATH/go.mod exists but should not goland
  • (1)Android开发优化---------UI优化
  • (30)数组元素和与数字和的绝对差
  • (9)目标检测_SSD的原理
  • (第61天)多租户架构(CDB/PDB)
  • (第一天)包装对象、作用域、创建对象
  • (二十三)Flask之高频面试点
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (论文阅读40-45)图像描述1
  • (三)uboot源码分析
  • (转)Linux下编译安装log4cxx
  • (转)Sublime Text3配置Lua运行环境
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Core 成都线下面基会拉开序幕
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET下ASPX编程的几个小问题
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .NET中两种OCR方式对比
  • /bin、/sbin、/usr/bin、/usr/sbin
  • /etc/fstab 只读无法修改的解决办法