修正后的堆排序算法

修正后的堆排序算法
  1  #include  < iostream >
  2  using   namespace  std;
  3 
  4  class  suanfa {
  5  public :
  6       int  tempsize;
  7      suanfa( int  heapsize);
  8       /* 将a[i]为根节点的子树生成最大堆! */
  9       void  heapify( int *  a,  int  i);
 10       /* 获取父节点,在这里没用 */
 11       int  parent( int  i);
 12       /* 获取左子树,数组序号 */
 13       int  left( int  i);
 14       /* 获取右子树,数组序号 */
 15       int  right( int  i);
 16       /* 交换2个值 */
 17       void  swap( int   * a , int  i,  int  j);
 18       /* 暂时先不用--日后再用 */
 19       void  max_heapify( int *  a,  int  heapsize);
 20       /* 堆排序 */
 21       void   heapify_sort( int *  a,  int  size);
 22       ~ suanfa();
 23  };
 24  suanfa::suanfa( int  heapsize){
 25      tempsize  =  heapsize;
 26  }
 27  int  suanfa::left( int  i){
 28       return   2 * +   1 ;
 29  }
 30  int  suanfa::right( int  i){
 31       return   2 * i + 2 ;
 32  }
 33  int  suanfa::parent( int  i){
 34       return  i / 2 ;
 35  }
 36 
 37  suanfa:: ~ suanfa(){
 38       // delete [] a;
 39       // m_array = NULL;
 40      cout  <<   " 我被析构了 "   <<  endl;
 41  }
 42  void  suanfa::heapify( int *  a,  int  i){
 43       int  l  =  left(i);
 44       int  r  =  right(i);
 45       int  largest  =   0 ; // 以a[i]为根节点的子树的最大值的数组下标
 46       int  size  =  tempsize; // heapsize 这里=数组的大小
 47       /* *获取该子树最大下标 */
 48       if  (l  >  size  - 1 ) {
 49          l  =  size  - 1 ;
 50      }
 51       if (r  >  size  - 1 ){
 52          r  =  size  - 1 ;
 53      }
 54       if  (l  <=  size  -   1    &&  a[l]  >  a[i]) {
 55          largest  =  l;
 56      } else  {
 57          largest  =  r;
 58      }
 59       if  (r  <=  size  -   1   &&  a[r]  >  a[largest]) {
 60          largest  =  r;
 61      }
 62       /* 如果根节点不是改子数组最大值,则进行交换 */
 63       if  (a[i]  <  a[largest]) {
 64          swap(a, i, largest);
 65          heapify(a, largest);
 66      }
 67 
 68      
 69  }
 70  void  suanfa::swap( int *  a,  int  i,  int  j){
 71       int  key  =  a[i];
 72      a[i]  =  a[j];
 73      a[j]  =  key;
 74  }
 75  void  suanfa::max_heapify( int *  a,  int  heapsize){
 76       // j->(heapsize-1)/2的子数组是最大堆.
 77       for ( int  j  =  (heapsize  -   1 /   2 ; j  >= 0 -- j)
 78      {
 79          heapify(a,j);
 80      }
 81  }
 82  void  suanfa::heapify_sort( int *  a,  int  size){
 83      max_heapify(a, size);
 84       for  ( int  i  =  size  - 1 ; i > 0 ; i -- ) {
 85          swap(a,  0 , i);
 86          tempsize  -- ;
 87          max_heapify(a, tempsize);
 88      }
 89  }
 90  int  main () {
 91      
 92       // int a[] = {16,4,10,14};
 93       int  a[ 10000 ];
 94       for  ( int  i = 0 ; i < 10000 ; i ++ ) {
 95          a[i]  =  i;
 96      }
 97       int  size  =   sizeof  a  /   sizeof  a[ 0 ];
 98      suanfa sf(size);
 99       // sf.heapify_sort(a, size);
100       // sf.heapify(a, 2);
101      sf.max_heapify(a, size);
102       for  ( int  i = 0 ; i < size; i ++ ) {
103          cout  <<  a[i]  <<   "   " ;
104      }
105      cout  <<  endl;
106       return   0 ;
107  }
108 

你可能感兴趣的:(修正后的堆排序算法)