<span style="white-space:pre"> </span>课题----创建优先队列
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>堆又称之为优先队列,其用途非常广泛,我们可以通过数组实现堆的存储。堆有一条很重要的性质,即堆中任一颗子树的根节点的值总是小于或等于其任一个儿子的节点值(前提是其存在儿子)。
堆存在诸多操作,如建堆,删除根,插入节点,合并堆等。其中建立堆是最基础的操作,在此,通过c++实现堆的建立。
#include <iostream>
using namespace std;
#define LEN 15 // 数组长度,一般取可以填充满一颗满二叉树的长度值。如本程序中关键字个数为10,相应的满二叉树有15个节点,即数组长度应取15
#define N 10 // 关键字数目
int main(int argc, char *argv[])
{
void buildHeap(int a[]);
void percolateDown(int a[], int index);
void printHeap(int a[]);
int a[LEN] = {0,2,5,1,12,6,9,8,32,20,16,0,0,0}; // 建立数组,0号元素不存放实际元素并设置为0,其余位置设为0
buildHeap(a);
printHeap(a);
return 0;
}
/**
描述: 建堆
a为存储堆元素的数组
*/
void buildHeap(int a[]){
void percolateDown(int a[], int index);
int k;
for(k = N / 2; k > 0; k--){
percolateDown(a, k);
}
}
/**
描述: 下虑节点
k为待下虑的节点位置
*/
void percolateDown(int a[], int k){
int temp = -1, tempValue = -1;
while(k <= N && k*2 <= N) {
// 待下虑的节点位置
if(a[k] > a[k * 2]) {
temp = k * 2;
}
if(k*2 + 1 <= N && a[k] > a[k*2 + 1]) {
temp = a[k*2] > a[k*2 + 1] ? k*2 + 1 : k*2;
}
// 是否下虑
if(temp != -1) {
tempValue = a[temp];
a[temp] = a[k];
a[k] = tempValue;
k = temp; // 下一个待下虑的节点位置
temp = -1;
continue;
}
break;
}
}
/**
输出堆
*/
void printHeap(int a[]){
int i;
for(i = 0; i <= LEN - 1; i++){
cout<<a[i]<<" ";
}
cout<<endl;
}