ヒープ---優先順位行列

6002 ワード

1.優先キューには、要素が優先されます.要素にアクセスすると、最優先の要素が最初に削除されます.優先キューは、最上位のファーストアウト(first in,larget out)の挙動特徴を有する.2.ヒープで実現する優先列の中で、最大ヒープは最大優先列にしか対応できません.最小ヒープは最小優先列に対応します.積み上げた実現はここを突いてください.
PriorityQueue.h
#define N 1000
typedef int Datatype;
typedef struct PriorityQueue
{
    Datatype a[N];
    size_t size;
}PriorityQueue;
void PriorityQueuePush(PriorityQueue* q,Datatype data);
void PriorityQueueInit(PriorityQueue* q);
void PriorityQueuePop(PriorityQueue* q);
Datatype PriorityQueueTop(PriorityQueue* q);
size_t PriorityQueueEmpty(PriorityQueue* q);
size_t PriorityQueueSize(PriorityQueue* q);
PriorityQueue.c
void PriorityQueueInit(PriorityQueue* q)
{
    assert(q);
    q->size = 0;
    memset(q->a, 0, sizeof(Datatype)*N);
}
void AdjustUp(Datatype* a,size_t size,int child)//    
{
    int parent = (child - 1) >> 1;
    while (child > 0)
    {
        if (a[child] > a[parent] && (child < size))
        {
            Datatype tmp = a[child];
            a[child] = a[parent];
            a[parent] = tmp;
        }
        else
            break;
        child = parent;
        parent = (child - 1) >> 1;
    }
}
void PriorityQueuePush(PriorityQueue* q, Datatype data)//  
{
    assert(q);
    if (N == q->size)
    {
        printf("PriorityQueue is FULL
"
); return; } q->a[q->size] = data; q->size++; /*for (int i = 0; i < q->size; i++) { AdjustDown(q->a, q->size, i); }*/ AdjustUp(q->a,q->size,q->size-1);// , ( ) , , } void PriorityQueuePop(PriorityQueue* q)// { assert(q); if (0 == q->size) { printf("PriorityQueue is NULL
"
); return; } /*size_t begin = 1;// O(n) while (begin < q->size) { q->a[begin - 1] = q->a[begin]; ++begin; } q->size--;*/ // , q->a[0] = q->a[q->size - 1];// O(log n) AdjustDown(q->a, q->size, 0); q->size--; } Datatype PriorityQueueTop(PriorityQueue* q) { return q->a[0]; } size_t PriorityQueueEmpty(PriorityQueue* q) { if (0 == q->size) return 0; } size_t PriorityQueueSize(PriorityQueue* q) { assert(q); int count = 0; while (q->size--) { count++; } return count; } void TestPriorityQueue() { PriorityQueue q; PriorityQueueInit(&q); PriorityQueuePush(&q, 5); PriorityQueuePush(&q, 2); PriorityQueuePush(&q, 3); PriorityQueuePush(&q, 18); PriorityQueuePush(&q, 0); PriorityQueuePush(&q, 23); PriorityQueuePush(&q, 7); PriorityQueuePush(&q, 6); PriorityQueuePush(&q, 1); PriorityQueuePush(&q, 4); while (PriorityQueueEmpty(&q) != 0) { printf("%d ", PriorityQueueTop(&q)); PriorityQueuePop(&q); } printf("
"
); }