ヒープ---優先順位行列
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("
");
}