堆排序-优先级队列
优先级队列
#include <iostream>
using namespace std;
void KeepCharacter(int *data,int n,int num) //保持性质函数,保证是一个大根推;
{
int left=n*2;
int right=n*2+1;
int max; //记录最大的数字的位置;
if(left<=num&&data[n]<data[left]) //比较根与左孩子大小,挑出一个比较大的数
max=left;
else
max=n;
if(right<=num&&data[max]<data[right]) //比较局部极大值与右孩子,挑出一个最大值
max=right;
if(max!=n)
{
int temp=data[max];
data[max]=data[n];
data[n]=temp;
KeepCharacter(data,max,num); //调整后子树有可能不满足性质,应该递归调用;
}
}
void HeapSort(int *data,int tempnum)
{
int temp=data[tempnum];
data[tempnum]=data[1];
data[1]=temp;
tempnum-=1;
for(int i=tempnum/2;i>=1;i--)
KeepCharacter(data,i,tempnum);
}
int MaxNum(int *data) //返回堆的最大值
{
return data[1];
}
void InsertNum(int *data,int key,int num) //向堆中插入元素
{
num++;
data[num]=key;
int parent=num/2;
int i=num;
while(parent!=0&&data[parent]<data[i])
{
int temp=data[i];
data[i]=data[parent];
data[parent]=temp;
i=parent;
parent/=2;
}
}
int ExtractMax(int *data,int num) //返回并删除堆中最大的元素
{
int temp=data[1];
data[1]=data[num];
data[num]=temp;
num--;
KeepCharacter(data,1,num);
return data[num+1];
}
void IncreaseKey(int *data,int position,int newvalue) //增大指定位置处的元素键值(注:不可小于原值)
{
if(data[position]>=newvalue)
return;
data[position]=newvalue;
int parent=position/2;
while(parent!=0&&data[parent]<data[position])
{
int temp=data[parent];
data[parent]=data[position];
data[position]=temp;
position=parent;
parent/=2;
}
}
int main()
{
int num;
cout<<"Please input the num of data:"<<endl;
cin>>num;
cout<<"Please input data:"<<endl;
int *data=new int[num+1];
for(int i=1;i<=num;i++)
cin>>data[i];
for(int i=num/2;i>=1;i--) //建堆调用
KeepCharacter(data,i,num);
cout<<"The max num is : "<<MaxNum(data)<<endl;
cout<<"Before Insert:";
for(int i=1;i<=num;i++)
cout<<data[i]<<" ";
cout<<endl;
cout<<"After Insert: ";
InsertNum(data,10,num);
num++;
for(int i=1;i<=num;i++)
cout<<data[i]<<" ";
cout<<endl<<"After increasekey: "<<endl;
IncreaseKey(data,3,8);
for(int i=1;i<=num;i++)
cout<<data[i]<<" ";
cout<<endl<<"After extarctmax: "<<endl;
ExtractMax(data,num);
num--;
for(int i=1;i<=num;i++)
cout<<data[i]<<" ";
cout<<endl;
int tempnum=num;
for(int i=num;i>=2;i--) //堆排序过程
{
HeapSort(data,tempnum);
tempnum--;
}
cout<<endl<<"After sorted:"<<endl;
for(int i=1;i<=num;i++)
cout<<data[i]<<" ";
cout<<endl;
return 0;
}
态度决定高度,细节决定成败,

浙公网安备 33010602011771号