zoukankan      html  css  js  c++  java
  • [有错误]堆排序的实现 java

    #include<iostream>
    using namespace std;
    //大根堆,从小到达排序
    int a[101];
    void swap(int &a,int &b)
    {
      a=a^b;
      b=a^b;
      a=a^b;
      
    
    
    }
    void adjust(int *a,int root,int len)
    {
        int max=root;
        int left=2*root;
        int right=2*root+1;
        if(left<=len&&a[max]<a[left])
        {
            max=left;
        
        }
    
        if(right<=len&&a[max]<a[right])
        {
            max=right;
        
        }
        if(max!=root)
        {
            swap(a[max],a[root]);
            
          adjust(a,max,len);
        
        }
    
    
    
    }
    void bulidHeap(int *a,int len)
    {
    
    
        for(int i=len/2;i>=1;i--)
        {
            adjust(a,i,len);
        
        
        }
    
    
    
    
    }
    
    void heapSort(int *a,int len)
    {
        if(len>1)
        {
            swap(a[1],a[len]);
            adjust(a,1,len-1);//调整为堆
            heapSort(a,len-1);
        
        }
    
    
    
    }
    void output(int *a,int len)
    {
        for(int i=1;i<=len;i++)
        {
            cout<<a[i]<<" ";
        
        }
        cout<<endl;
    
    }
    
    int main()
    {
        
        while(!cin.eof())
        {
            int len;
            cin>>len;
            for(int i=1;i<=len;i++)
            {
              cin>>a[i];
            }
            
            bulidHeap(a,len);
            
            heapSort(a,len);
            output(a,len);
        
        
        
        }
        
    
        return 0;
    
    
    
    }




     1 //一个大根堆的例子
     2 //author:张小二
     3 public class HeapSort {
     4     public static void swap(int a[],int i,int j)
     5     {
     6         
     7         int temp=a[i];
     8         a[i]=a[j];
     9         a[j]=temp;
    10         
    11     
    12     }
    13     //最重要的自上而下调整的方法。,最多的代码在此处,建队和堆排序都是靠他。
    14     public static void adjust(int a[],int i,int len)//调整以i为根
    15     {
    16         
    17         while(true)
    18         {
    19             int largest=i;//寻找 i,2i+1,2i+2中的最大值
    20             int r=2*i;
    21             int l=2*i+1;
    22             if(r<len&&a[r]>a[largest]) largest=r;
    23             if(l<len&&a[l]>a[largest]) largest=l;
    24             if(largest==i) break;
    25             
    26             swap(a,i,largest);
    27             i=largest;
    28         
    29             
    30         
    31         }
    32         
    33             
    34     }
    35     //建立堆,从最后一个非叶子开始
    36     public static  void bulid(int a[],int len)
    37     {
    38         display(a);
    39         len=len-1;
    40         for(int i=len/2;i>=0;i--)
    41         {
    42             adjust(a,i,len);
    43             
    44             
    45         }
    46         
    47         
    48     }
    49     //堆排序
    50     public static void heapSort(int a[])
    51     {
    52         bulid(a,a.length);
    53         
    54         
    55         int len=a.length-1;
    56         while(len<1)
    57         {
    58             swap(a,0,len);
    59             adjust(a,0,len);
    60             len--;
    61             
    62             
    63         }
    64         //after 
    65         display(a);
    66     }
    67     
    68     public static void display(int a[])
    69     {
    70         for(int i=0;i<a.length;i++)
    71         {
    72             System.out.print(a[i]+" ");
    73         }
    74         System.out.println();
    75         
    76     }
    77 
    78     /**
    79      * @param args
    80      */
    81     public static void main(String[] args) {
    82         // TODO Auto-generated method stub
    83         int a[]={3,-3,5,6,-7,9,45};
    84         heapSort(a);
    85         
    86 
    87     }
    88 
    89 }
    
    
    
     
  • 相关阅读:
    PAT乙级1014.福尔摩斯的约会 (20)(20 分)
    PAT乙级1013.数素数
    PAT乙级1012.数字分类 (20)(20 分)
    PAT乙级1011.A+B和C (15)(15 分)
    PAT乙级1025.反转链表 (25)
    PAT乙级1020.月饼(20)
    PAT乙级1015.德才论(25)
    PAT乙级1010.一元多项式求导(25)
    PAT乙级1009.说反话(20)
    PAT乙级1008.数组元素循环右移问题(20)
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/3735186.html
Copyright © 2011-2022 走看看