最小堆Min_Heapify

//  Min_Heapify.cpp : Defines the entry point for the console application.
//

#include 
" stdafx.h "
#include 
< iostream >
#include 
< algorithm >

class  Min_Heapify {
private:
    
int m_size;
    
int Parent(int i)return i/2; }
    
int Left(int i)  return 2*i; }
    
int Right(int i) {return 2*i+1;}
    
    
void Min_Adus_Heapify(int A[],int i)
    
{
        
int l = Left(i);
        
int r = Right(i);
        
int lest = i;
        
if((l <= m_size) && (A[l] < A[i]))//
            lest = l;
//从元素A[Left(i)],A[Right(i)],A[i]找出最小的元素。
        
        
if((r <= m_size) && (A[r] <A[lest]))
            lest 
= r;
//并将下标存放在largest中。如果A[i]最小,则以i为根的子树而使i及其子树满足堆的性质。        
        if (lest != i)
        
{
          std::swap(A[i], A[lest] );
//
         Min_Adus_Heapify(A, largest); //
        }

//下标为largest的节点在交换后的值是A[i],以该节点为根的子树又有可能违反最大堆的性质。因而要递归调用。        
    
    }

    
void Build_Min_Heapify(int A[])
    
{   
           
for(int i = m_size/2; i >= 0; i--)
           Min_Adus_Heapify(A, i);
    }

//建堆:子数组A[n/2+1...n]中的元素都是叶子节点,因此每个都可以看作只含一个元素的堆.
//m_size/2与m_size一样都正确,也就是上面句子的解释。


public:
    Min_Heapify():m_size(NULL)
{}
    Min_Heapify(
int A[],int size)
    

        m_size 
=  size-1;
        Build_Min_Heapify(A);
    }

   
    
void Heap_Sort(int A[])
    
{  
        Build_Min_Heapify(A);
        
for(int i = m_size; i >= 1; i--)
        
{
            std::swap(A[
0], A[i]);
            
--m_size;
            Min_Adus_Heapify(A, 
0);
        }

    }
      
 
//Build_Max_Heapify(),将使A[0]达到最小值。这样一直循环交换存放在数组A[i]中,递归调用。

    
~Min_Heapify(){}
}
;

int  main( int  argc,  char *  argv[])
{
    
    
int A[11= 3045227291226802243,1};
    
int size = sizeof(A)/sizeof(A[0]);
    Min_Heapify p(A, size);
    p.Heap_Sort(A);
    std::copy(A, A
+11, std::ostream_iterator<int>(std::cout, " "));
    
return 0;
}



/*int main(int argc, char* argv[])
{
    return 0;
}
*/

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yshuise

权术横行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值