先是在 main () 函数中构造输入.之后调用主例程解决问题.可以看到,主例程是相当精妙的.这当然是需要前面数据结构的正确.
/*MergeQueue.c -- O (NlogK) 时间将K个有序队列合并为一个新有序队列*/
#include "Queue.h"
#include "PriorityQueue.h"
#define SIZE (5)
int main (void) ;
BOOL merge (const Queue * const array, const int number, Queue * const pNewQueue) ;
int main (void)
{
Queue array[SIZE] ;
Queue q1, q2, q3, q4, q5, newQueue ;
Item item ;
/*Artificial element.*/
Initialize_Q (&q1) ;
Initialize_Q (&q2) ;
Initialize_Q (&q3) ;
Initialize_Q (&q4) ;
Initialize_Q (&q5) ;
item = 1 ;
EnQueue_Q (&q1, item) ;
item = 2 ;
EnQueue_Q (&q1, item) ;
item = 2 ;
EnQueue_Q (&q1, item) ;
item = 4 ;
EnQueue_Q (&q1, item) ;
item = 20 ;
EnQueue_Q (&q1, item) ;
item = 3 ;
EnQueue_Q (&q2, item) ;
item = 7 ;
EnQueue_Q (&q2, item) ;
item = 8 ;
EnQueue_Q (&q2, item) ;
item = 8 ;
EnQueue_Q (&q2, item) ;
item = 9 ;
EnQueue_Q (&q2, item) ;
item = 16 ;
EnQueue_Q (&q2, item) ;
item = 45 ;
EnQueue_Q (&q3, item) ;
item = 56 ;
EnQueue_Q (&q3, item) ;
item = 77 ;
EnQueue_Q (&q3, item) ;
item = 14 ;
EnQueue_Q (&q4, item) ;
item = 67 ;
EnQueue_Q (&q4, item) ;
item = 78 ;
EnQueue_Q (&q4, item) ;
item = 89 ;
EnQueue_Q (&q4, item) ;
item = 90 ;
EnQueue_Q (&q4, item) ;
item = 92 ;
EnQueue_Q (&q4, item) ;
item = 11 ;
EnQueue_Q (&q5, item) ;
item = 22 ;
EnQueue_Q (&q5, item) ;
item = 33 ;
EnQueue_Q (&q5, item) ;
item = 34 ;
EnQueue_Q (&q5, item) ;
item = 35 ;
EnQueue_Q (&q5, item) ;
item = 37 ;
EnQueue_Q (&q5, item) ;
item = 45 ;
EnQueue_Q (&q5, item) ;
item = 56 ;
EnQueue_Q (&q5, item) ;
item = 67 ;
EnQueue_Q (&q5, item) ;
array[0] = q1 ;
array[1] = q2 ;
array[2] = q3 ;
array[3] = q4 ;
array[4] = q5 ;
/*Initialize new queue.*/
Initialize_Q (&newQueue) ;
/*It's so attractive!*/
merge (array, SIZE, &newQueue) ;
Release_Q (&q1) ;
Release_Q (&q2) ;
Release_Q (&q3) ;
Release_Q (&q4) ;
Release_Q (&q5) ;
Release_Q (&newQueue) ;
return 0 ;
}
/*O (NlogK)*/
BOOL merge (const Queue * const array, const int number, Queue * const pNewQueue)
{
PriorityQueue pq ;
PriorityNode temp ;
int i ;
if (number <= 0 || FALSE == Initialize_P (&pq, number))
return FALSE ;
/*Bulid heap.*/
for (i = 0; i < number; i++)
Insert_P (&pq, array[i] -> front) ;
/*Core loop.*/
while (FALSE == IsEmpty_P (&pq))
{
temp = DeleteMin_P (&pq) ;
EnQueue_Q (pNewQueue, temp -> item) ;
if (temp -> next != NULL)
Insert_P (&pq, temp -> next) ;
}
Release_P (&pq) ;
return TRUE ;
}