优先队列(堆)

在打印机作业时一般采用队列的形式FIFO(fisrt in first out),但遇到一个1份的和一个100份的作业时,先打印1份的相对合理;另外,不同作业的优先级也不同,优先级高的应该先处理。

 insert == Enqueue

deleteMin == Dequeue

二叉堆(完全二叉树):除了底层,一棵被完全填满的二叉树,底层上元素从左到右填入。

完全二叉树很有规律,可用数组表示:对于任一节点元素X,其父节点元素H->element[i/2],其左儿子H->element[2i],右儿子H->element[2i+1]。

  A B C D E F G H I  J  

0 1 2 3 4 5 6 7 8 9 10 11 12 13 

一个堆的数据结构:一个数组、容量、当前堆大小。

注意事项:

节点声明:

struct heap
{
       int           capacity;
       int           size;
       elementType   *elements;
}

堆序性:节点X的关键字 大于等于  节点X父亲节点的关键字。

priority queue creat:

priorityQueue *initialize( int maxElement)
{
       priotityQueue *H;
       if (maxElement < minPQSize)
       {
             cout << "priorityQueue is too small" << endl;
             return NULL;
       } 
       H->elements = New element[maxElement + 1];
       if(H->elements == NULL)
       {
             cout << "out of space" << endl;
             return NULL;
       }
       H->capacity = maxElement;
       H->size = 0;
       //minData为足够小的数,保证元素插入后最多上滤到i=1处,即根节点。
       H->elements[0] = minData; 

return H;
}

 insert:(末端插入)

void insert (elementType X , PriotityQueue *H)
{
       if (isFull (H))
       {
           cout<< "out of space" << endl;
           return;
       }
       // H->elements[0]是一个足够小的数minData,保证X<minData不成立。
       for(int i = ++H->size; X < H->elements[i/2]; i/=2) 
H
->elements[i] = H->elements[i/2];
H
->elements[i] = X;
}

 deleteMin(根处删除)

elementType deleteMin(priorityQueue *H)
{
       int child;
       elementType minElement , lastElement;

       if(isEmpty(H))
       {
             cout << "priotityQueue is empty" << endl;
             return H->elements[0];
       }
       minElement = H->elements[1];
       lastElement = H->elements[H->size--];//保存最后一个元素,size-1
          
       for( int i = 1; 2*i <= H->size; i = child)
       {
             child = 2*i;
             if(child != H->size && H->element[child + 1] < H->element[child])
                child++;
             if(H->element[child]<lastElement)  
                H->element[i] = H->element[child];  //由二叉堆的堆序性可知min堆的节点X < 其儿子节点
             else 
                break;
       }
       H->elements[i] = lastElement;
       return minElement;
}
原文地址:https://www.cnblogs.com/Lunais/p/5579092.html