优先队列(二叉堆)的插入程序

来源:互联网 发布:同城网络2018招财务吗 编辑:程序博客网 时间:2024/06/08 13:56

《数据结构与算法分析》习题6.2,这题是问答题,心血来潮下决心用程序实现,编程菜鸟前前后后调试了大概一天时间才完成两种算法,下面是第一种算法,时间复杂度为O(NlogN)。

#include<stdio.h>#include<stdlib.h>typedef struct heapStruct{    int Capacity;    int Size;    int *Elements;}*priorityQueue;priorityQueue initQueue(int n){    priorityQueue H;    H = (priorityQueue)malloc(sizeof(priorityQueue));    if(H == NULL)        printf("Out of space!!!");        H->Elements = (int *)malloc((n+1)*sizeof(int));    if(H->Elements == NULL)        printf("Out of space!!!");    H->Capacity = n;    H->Size = 0;    H->Elements[0] = -1;    return H;}int isFull(priorityQueue H){    return H->Size == H->Capacity;}int isEmpty(priorityQueue H){    return H->Size == 0;}void Insert(int X, priorityQueue H){    int i;    if(isFull(H))    {        printf("Priority queue is full");        return;    }    for(i = ++H->Size; H->Elements[i/2] > X; i /= 2)        H->Elements[i] = H->Elements[i/2];    H->Elements[i] = X;}void printQueue(priorityQueue H){    int i;    if(isEmpty(H))        printf("H is NULL");    for(i=1; i<=H->Size; i++)        printf("%d ", H->Elements[i]);}void main(){    int input[15] = {10,12,1,14,6,5,8,15,3,9,7,4,11,13,2};    int i;    priorityQueue H = initQueue(20);        for(i = 0; i < 15; i++)        Insert(input[i], H);    printQueue(H);}       

第二种算法是将N个关键字以任意顺序放入书中,保持结构特性。为了保持二叉堆的性质可能需要将父节点下滤,时间复杂度为O(N)。使用Swap函数的时候遇到问题,后面将会总结一下Swap函数。

#include<stdio.h>#include<stdlib.h>typedef struct heapStruct{    int Capacity;    int Size;    int *Elements;}*priorityQueue;int isFull(priorityQueue H){    return H->Size == H->Capacity;}int isEmpty(priorityQueue H){    return H->Size == 0;}void Swap(int *a, int *b){    int Tmp = *a;    *a = *b;     *b = Tmp;}void percolateDown(int i, priorityQueue H){    int j;    for(j=i; (2*j+1) <= H->Size && H->Elements[j]>Min(H->Elements[2*j],H->Elements[2*j+1]);)    {        if(H->Elements[2*j]<H->Elements[2*j+1])        {            Swap(&H->Elements[j], &H->Elements[2*j]);            j *= 2;        }        else        {            Swap(&H->Elements[j], &H->Elements[2*j+1]);            j = 2*j+1;        }    }            }priorityQueue buildHeap(int a[], int n){    int i, j;    priorityQueue H;    H = (priorityQueue)malloc(sizeof(priorityQueue));    if(H == NULL)        printf("Out of space!!!");    H->Elements = (int *)malloc((n+1)*sizeof(int));    if(H->Elements == NULL)        printf("Out of space!!!");    H->Capacity = n;    H->Size = n;    H->Elements[0] = -1;    for(i=1; i<=n; i++)H->Elements[i] = a[i-1];    for(j=n/2; j>0; j--)percolateDown(j, H);    return H;}int Min(int a, int b){    return ((a < b)? a : b);}void printQueue(priorityQueue H){    int i;    if(isEmpty(H))        printf("H is NULL");    for(i=1; i<=H->Size; i++)        printf("%d ", H->Elements[i]);}void main(){    int input[15] = {10,12,1,14,6,5,8,15,3,9,7,4,11,13,2};    printQueue(buildHeap(input, 15));}




0 0
原创粉丝点击