标签:
根据《算法导论》中介绍的算法实现。
#include <stdio.h> #include <stdbool.h> #include <stdlib.h> typedef struct priority_queue_tag { int heap_size; int *array; } priority_queue; int parent(int i) { return (i - 1) / 2; } int left_child(int i) { return i * 2 + 1; } int right_child(int i) { return i * 2 + 2; } void swap(int *a, int *b) { if(a == NULL|| b == NULL || a==b) return; int t = *a; *a = *b; *b = t; } void heapify(priority_queue *pq, int i) { int left = left_child(i); int right = right_child(i); int largest = i; if (left < pq->heap_size && pq->array[largest] < pq->array[left]) { largest = left; } if (right < pq->heap_size && pq->array[largest] < pq->array[right]) { largest = right; } if (largest != i) { swap(&pq->array[i], &pq->array[largest]); heapify(pq, largest); } } void fix_up(priority_queue *pq, int i) { while (i > 0 && pq->array[parent(i)] < pq->array[i]) { swap(&pq->array[parent(i)], &pq->array[i]); i = parent(i); } } priority_queue *priority_queue_create(int n) { priority_queue *pq = (priority_queue *)malloc(sizeof(priority_queue)); pq->array = (int *)malloc(sizeof(void *) * n); pq->heap_size = 0; return pq; } int priority_queue_top(priority_queue* pq) { return pq->array[0]; } /*去掉并返回堆的第一个元素 */ int priority_queue_extract_top(priority_queue* pq) { int i = pq->heap_size - 1; swap(&pq->array[0], &pq->array[i]); --pq->heap_size; heapify(pq, 0); return pq->array[i]; } /*把元素key插入队列 */ void priority_queue_insert(priority_queue *pq, int key) { int i = pq->heap_size; pq->array[i] = key; ++pq->heap_size; fix_up(pq, i); } bool priority_queue_is_empty(priority_queue *pq) { return pq->heap_size == 0; } void priority_queue_destroy(priority_queue *pq) { free(pq->array); free(pq); } int main() { priority_queue *pq = priority_queue_create(10); for (int i = 0; i < 10; i++) { priority_queue_insert(pq, i); } printf("最大堆结果:\n"); while (!priority_queue_is_empty(pq)) { int p = priority_queue_extract_top(pq); printf("%d ", p); } printf("\n"); priority_queue_destroy(pq); return 0; }
标签:
原文地址:http://www.cnblogs.com/moxiaopeng/p/4857612.html