C语言,优先级队列

#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 */
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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值