最小优先级队列 — 使用最小堆实现

最小优先级支持的操作:

1.INSERT(S,x):将元素x插入队列S

2.MINIMUM(S):返回S中最小的元素

3.EXTRACT_MIN(S):去掉并返回S中最小的元素

4.DECREASE_KEY(S,x,key):将下标为x的元素值降低为key

 

使用最小堆实现最小优先级队列。最小堆是一个完全二叉树,从编号1开始:

注意几个操作:向下调整(建堆、调整堆),向上调整(建堆后,插入元素、更改元素)、heap_size的应用和变化

 

//最小优先级队列

#include<stdio.h>

#include<stdlib.h>

 

int heap_size = 0;

 

int parent(int i){

    return i/2;

}

 

int left_child(int i){

    return 2*i;

}

 

int right_child(int i){

    return 2*i+1;

}

 

void swap(int * a, int * b){

     int c = *a;

     *a = *b;

     *b = c;

}

 

void heap_adjust(int *arr, int i){

    int min = i;

    int left = left_child(i);

    int right = right_child(i);

   

    if(left<=heap_size && arr[left] < arr[min]){

         min = left;

    }

   

    if(right<=heap_size && arr[right] < arr[min]){

         min = right;

    }

   

    if(min != i){

         swap(&arr[i],&arr[min]);

         heap_adjust(arr,min);

    }

}

 

void heap_create(int * arr, int num){

    if(NULL == arr){

            return;

    }

    int i = 0;

    heap_size = num;

    for(i=num/2; i>=1; i--){

         heap_adjust(arr,i);        

    }

}

 

void heap_sort(int * arr){

    while(heap_size > 1){

              swap(&arr[1],&arr[heap_size]);

              heap_size --;

              heap_adjust(arr,1);

    }

}

 

//将元素x插入队列

void insert(int * arr, int x){

    heap_size++;

    arr[heap_size] = x;

    int i=0;

    for(i=heap_size/2; i>=1; i--){

         heap_adjust(arr,i);        

    }

}

 

//返回队列中最小的元素

int minimum(int * arr){

    return arr[1];

}

 

//去掉并返回队列中最小的元素

int extract_min(int *arr){

    int min = arr[1];

    arr[1] = arr[heap_size];

    heap_size--;

    heap_adjust(arr,1);

    return min;

}

 

//将下标为x的元素值降低为key

void decrease_key(int * arr, int x, int key){

    if(x >=1 && x<=heap_size){

         arr[x] = key;

         while(parent(x) >= 1 && arr[parent(x)] > arr[x]){

             swap(&arr[parent(x)],&arr[x]);

             x = parent(x);

         } 

    }

}

 

//借助上函数实现插入元素x到队列

void insert2(int * arr, int x){

     heap_size++;    

     arr[heap_size] = x;

     decrease_key(arr,heap_size,x);

}

 

int main(){

   

    int i,n;

    int arr[100];

   

    scanf("%d",&n);

    for(i=1; i<=n; i++){

             scanf("%d",&arr[i]);

    }

    heap_create(arr,n);

    //heap_sort(arr);

    //printf("%d\n",minimum(arr));

    //printf("%d\n",extract_min(arr));

    //insert(arr,1);

    //decrease_key(arr,3,1);

    insert2(arr,19);

   

    for(i=1; i<=heap_size; i++){

             printf("%d ",arr[i]);

    }

   

    system("pause");

    return 0;

}

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值