zoukankan      html  css  js  c++  java
  • 堆排序优先级队列

    优先级队列

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

      

    态度决定高度,细节决定成败,
  • 相关阅读:
    dart 函数迭代器
    dart 编译
    dart 扩展方法
    dart 包
    默认2345导航
    (24)WPF 数据绑定
    (22)WPF 控件模板
    JSP慕课网之Session
    HTML <td> 标签的 colspan 属性
    HTML Input属性
  • 原文地址:https://www.cnblogs.com/lxk2010012997/p/3025242.html
Copyright © 2011-2022 走看看