您的位置:首页 > 编程语言 > C语言/C++

优先队列的c++实现

2014-02-27 22:15 477 查看
一、优先队列c++实现源代码

#include <iostream>
#include <assert.h>
using namespace std;

//function: 返回最大值
int HeapMaximum(int* array);

//function: 返回最大值并删除
int HeapRactMax(int*& array, int n);

void Exchange(int* a, int* b);

//function: 维护堆的性质
void RecursionHeap(int* array, int i, int n);

//function: 建堆
void BuildHeap(int* array, int n);

//function: 关键字的值增加到key
void IncreaseKey(int* array, int i, int key);

//function: 插入一个元素
void InsertKey(int*& array, int key, int n);

int main()
{
int* array = new int[10];
for (int i = 0; i < 10; ++ i)
cin >> array[i];
BuildHeap(array, 10);
for (i = 0; i < 10; ++ i)
cout << array[i] << " ";
cout << endl;
cout << HeapMaximum(array) << endl; //测试最大值
cout << HeapRactMax(array, 10) << endl; //

for (i = 0; i < 9; ++ i)
cout << array[i] << " ";
cout << endl;

IncreaseKey(array, 8, 100);
for (i = 0; i < 9; ++ i)
cout << array[i] << " ";
cout << endl;
InsertKey(array, 10, 9);
for (i = 0; i < 10; ++ i)
cout << array[i] << " ";
cout << endl;
delete [] array;
return 0;
}

int HeapMaximum(int* array)
{
return array[0];
}

int HeapRactMax(int*& array, int n)
{
assert(n);
int tmp = array[0];
Exchange(&array[0], &array[n - 1]);
RecursionHeap(array, 0, n - 1);
int *pTmp = new int[n - 1];
memcpy(pTmp, array, (n - 1) * sizeof (int));
delete [] array;
array = pTmp;
return tmp;
}

void Exchange(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}

void RecursionHeap(int* array, int i, int n)
{
int large;
if (2 * i + 1 < n && array[2 * i + 1] > array[i])
large = 2 * i + 1;
else
large = i;
if (2 * i + 2 < n && array[2 * i + 2] > array[large])
large = 2 * i + 2;
if (large != i)
{
Exchange(&array[i], &array[large]);
RecursionHeap(array, large, n);
}
}

void IncreaseKey(int* array, int i, int key)
{
assert(key >= array[i]);
array[i] = key;
int parent;
// 	for (int j = i; j >= 0; )
// 	{
// 		parent = (j - 1) / 2;
// 		if (parent >= 0 && array[parent] < key)
// 		{
// 			array[j] = array[parent];
// 			j = parent;
// 			if (parent == 0)
// 			{
// 				array[0] = key;
// 				break;
// 			}
// 		}
// 		else
// 		{
// 			array[j] = key;
// 			break;
// 		}
// 	}
parent = (i - 1) / 2;
while (parent >= 0 && array[parent] < array[i])
{
Exchange(&array[parent], &array[i]);
i = parent;
parent = (i - 1) / 2;
}
}

void InsertKey(int*& array, int key, int n)
{
int* pTmp = new int[n + 1];
memcpy(pTmp, array, sizeof (int) * n);
delete []array;
pTmp
= -100000;
IncreaseKey(pTmp, n, key);
array = pTmp;
}

void BuildHeap(int* array, int n)
{
for (int i = (n - 2) / 2; i >= 0; -- i)
RecursionHeap(array, i, n);
}


二、注意

1、形参的拷贝是赋值传递,在函数内部处理的只是一个副本,如果想改变指针的地址值,应该通过引用方式传递。

2、边界条件的处理。例如 j = (j - 1) / 2; j的下限就是0,值得思考。

3、 如果for循环中要用到break,可以考虑用while来替换,往往代码更加简便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 算法 优先队列