数据结构与算法分析---优先队列(二叉堆)的实现(C语言)

优先队列,是一种特殊的队列,队列取出元素是按照先进先出的顺序,而优先队列是为每一个元素都赋予一个优先级,按照优先级的大小取出,这里的优先级通常是元素的大小,所以有最大堆和最小堆,使用二叉堆这种数据结构来实现优先队列,二叉堆有两种性质,第一种是结构性质,是一棵完全二叉树,这样我们可以利用数组来存储元素,并且能快速的找到父亲节点(i/2)和左(2*i)右(2*i+1)儿子,另一种是堆序性,父节点的值小于等于子节点的值,所以根节点为最小值,叫最小堆,反之,最大堆。有两种重要操作,插入元素和删除并返回最小值,下面给出这两种操作的C语言实现方式

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

struct HeapStruct
{
    int Capacity;
    int Size;
    int *Data;
};
typedef struct HeapStruct *PriorityQueue;
PriorityQueue Create(int Maxsize)
{
    PriorityQueue H;
    H = (PriorityQueue) malloc(sizeof(struct HeapStruct));
    H -> Data =  malloc(sizeof(int) * (Maxsize + 1));
    H -> Capacity = Maxsize;
    H -> Size = 0;
    H -> Data[0] = INT_MIN;
    return H;
}
void Insert(int x,PriorityQueue H)
{
    int i;
    if(H -> Size == H -> Capacity) {
        printf("Priotiry Queue is full\n");
        return;
    }
    for(i = ++H -> Size; H -> Data[i / 2] > x; i /= 2) {
        H -> Data[i] = H -> Data[i / 2];
    }
    H -> Data[i] = x;
}
int DeleteMin(PriorityQueue H)
{
    if(H -> Size == 0) {
        printf("Priority Queue is Empty\n");
        return;
    }
    int MinData,LastData,child,i;
    MinData = H -> Data[1];
    LastData = H -> Data[H -> Size--];
    for(i = 1; i * 2 <= H -> Size; i = child)
    {
        //Find smaller child
        child = i * 2;
        if(child != H -> Size && H -> Data[child] > H -> Data[child + 1]) {
            child++;
        }

        if(LastData > H -> Data[child]) {
            H -> Data[i] = H -> Data[child];
        }
        else {
            break;
        }
    }
    H -> Data[i] = LastData;
    return MinData;
}
int main(void)
{
    PriorityQueue H = Create(100);
    int a[] = {80, 40, 30, 60, 90, 70, 10, 50, 20};
    int i;
    for(i = 0; i < sizeof(a) / sizeof(int); i++) {
        Insert(a[i],H);
    }
    for(i = 0; i < sizeof(a) / sizeof(int); i++) {
        printf("%d\n",DeleteMin(H));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/GYH0730/article/details/81394735