算法导论 6章堆排序的代码实现和部分课后练习

以最大堆来实现最大优先队列:

heap.h

#include <stdio.h>
#include <limits.h>
int parent(int i);    //计算父节点的下标
int Left(int i);      //计算分支左结点的下标
int Right(int i);
void MAX_HEAPIFY(int A[],int i);   //保证最大堆的性质
int HEAP_EXTRACT_MAX(int A[]);     //返回并去掉最大项
void HEAP_INCREASE_KEY(int A[],int i,int key);  //将结点i的值增大为key
void MAX_HEAP_INSERT(int A[],int key);  //插入值Key
void MAX_HEAP_DELETE(int A[],int i);   //删除结点i

heap.c 文件

#include "heap.h"
int heap_size = 0;
int     MIN =INT_MIN; 
int parent(int i){
return i/2;
}
int Left(int i){
return 2*i;
}
int Right(int i){
return 2*i+1;
}
void MAX_HEAPIFY(int A[],int i){
    int r,l,temp
    int largest ;
    if(l <=heap_size && A[l] > A[i])
        largest = l;
    else
        largest = i;
    if(r <=heap_size && A[r] > A[largest])
        largest = r;
    if(largest != i){
    temp = A[i];
    A[i] = A[largest];
    A[largest] = temp;
    MAX_HEAPIFY(A,largest);
    }
}
int HEAP_EXTRACT_MAX(int A[]){
    int max;
    max = A[1];
    A[1] = A[heap_size];
    heap_size = heap_size -1;
    MAX_HEAPIFY(A,1);
    return max;
}
void HEAP_INCREASE_KEY(int A[],int i,int key){
    if(key < A[i])
    printf("the key is to small");
    A[i] = key;
    while(i>1 && A[parent(i)] < A[i]){
    temp = A[i];
    A[i] = A[parent(i)];
    A[parent(i)] = temp;
    i = parent(i);
    }
}
void MAX_HEAP_INSERT(int A[],int key){
    heap_size = heap_size +1;
    A[heap_size] = MIN;
    MAX_INCREASE_KEY(A,heap_size,key);
} 
/*把最后一个元素替换掉要删除的结点*/
void MAX_HEAP_DELETE(int A[],int i){
    int temp = A[heap_size];
    if(A[i] == temp)
        heap_size --;
    else(A[i] > temp){
        A[i] = temp;
        heap_size --;
        MAX_HEAPIFY(A,i);
    }
}       

我们也可以使用最小堆来实现先进先出队列

先进入的优先级小,然后优先级按照最小堆排列,先出的也是从最小的开始。

使用最大堆来实现栈

先进入的优先级小,然互优先级按照最大堆排列,先出的优先级高,先进后出。

你可能感兴趣的:(算法导论,heap,堆排序,先进先出队列)