• 堆排序算法


    堆排序

    #include <iostream>
    using namespace std;
    int tempnum;
    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 num)
    {
        for(int i=num/2;i>=1;i--)              //建堆调用
        KeepCharacter(data,i,num);
    
        for(int i=num;i>=2;i--)
        {
            int temp=data[1];
            data[1]=data[i];
            data[i]=temp;
            num-=1;
            KeepCharacter(data,1,num);
        }
    }
    
    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);
    
        HeapSort(data,num);
    
        cout<<"After sorted:"<<endl;
        for(int i=1;i<=num;i++)
        cout<<data[i]<<" ";
        cout<<endl;
    }
    

     最初版本:

    #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 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);
    
        int tempnum=num;
        for(int i=num;i>=2;i--)                //堆排序过程
         {
             HeapSort(data,tempnum);
             tempnum--;
         }
    
        cout<<"After sorted:"<<endl;
        for(int i=1;i<=num;i++)
        cout<<data[i]<<" ";
        cout<<endl;
    }
    

      

    态度决定高度,细节决定成败,
  • 相关阅读:
    屏幕录像大师2016【破解版】
    Hibernate demo之使用注解
    Hibernate demo之使用xml
    Hibernate 的<generator class="native"></generator>的不同属性含义
    java 动态实现接口
    c# emit 实现类的代理
    c# emit 动态实现接口
    java nio读取和写入文件
    java 读取Properties
    Java中利用MessageFormat对象实现类似C# string.Format方法格式化
  • 原文地址:https://www.cnblogs.com/lxk2010012997/p/3023240.html
Copyright © 2020-2023  润新知