堆排序-优先级队列

优先级队列

#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;
}

  

posted @ 2013-04-16 23:05  再见,少年  Views(163)  Comments(0Edit  收藏  举报