首页 > 编程语言 > 详细

C++最大堆实现priority_queue优先级队列(算法导论)

时间:2014-03-12 00:33:22      阅读:624      评论:0      收藏:0      [点我收藏+]

max_heapify与build_max_heap过程与heapsort一样

#include <iostream>
#include <cstdio>
#include <ctime>
#include <cstdlib>
using namespace std;

const int INT_MIN = -(1 << 31);
inline void swap(int &a, int &b) { int t = a; a = b; b = t; }
inline int parent(int i) { return (i-1) >> 1; }         //下标都是从0开始,与算导上不一样
inline int left(int i) { return (i << 1) + 1; }
inline int right(int i) { return (i << 1) + 2; }

int heap_size, heap_length;          //heap_length是数组元素个数,heap_size是有多少个元素存储在数组中。0<=heap_size<=heap_length

void max_heapify(int *a, int i) {             //O(lgn), 维护heap的性质,使得以下标i为根结点的子树重新遵循最大堆的性质
	int l = left(i), r = right(i);
	int largest = 0;
	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) {
		swap(a[i], a[largest]);
		max_heapify(a, largest);
	}
}

void build_max_heap(int *a) {             //O(n), 对树中非叶结点都调用一次 max_heapify
	heap_size = heap_length;
	for (int i = heap_length/2 - 1; i >= 0; --i)   //可以证明下标为n/2-1到0的结点为非叶结点
		max_heapify(a, i);
}


int heap_maximum(int *A) {
	return A[0];
}

int heap_extract_max(int *A) {
//	if (heap_size < 1)
//		return;
	int max = A[0];
	A[0] = A[heap_size-1];
	--heap_size;
	max_heapify(A, 0);
	return max;
}

void heap_increase(int *A, int i, int key) {
	if (key < A[i])
		return;
	A[i] = key;
	while (i > 0 && A[parent(i)] < A[i]) {
		swap(A[i], A[parent(i)]);
		i = parent(i);
	}
}

void max_heap_insert(int *A, int key) {
	++heap_size;
	A[heap_size-1] =  INT_MIN;
	heap_increase(A, heap_size-1, key);
}

bool empty() {
	return heap_size == 0;
}
int main()
{
	srand(time(NULL));
	while (scanf("%d", &heap_length) != EOF) {
		int a[heap_length];
		for (int i = 0; i < heap_length; ++i)
			a[i] = rand() % heap_length;
		build_max_heap(a);                           //构建最大堆
		while (!empty()) {
			printf("%d ", heap_extract_max(a));
		}
		printf("\n");
	}
	return 0;
}


C++最大堆实现priority_queue优先级队列(算法导论),布布扣,bubuko.com

C++最大堆实现priority_queue优先级队列(算法导论)

原文:http://blog.csdn.net/pegasuswang_/article/details/21045315

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!