排序算法_堆排序(最大堆、最小堆)

int left(int i)
{
return 2*i;
}


int right(int i)
{
return 2*i+1;
}
void exchange(int &a,int &b)
{
    a=a+b;
    b=a-b;
    a=a-b;
}
//--------------------------
template<typename T>
void max_heapify(T a[],int i,int size)
{
int l=left(i);
int r = right(i);
int largest = 0;
if(l<=size&&a[l]>a[i])
{
largest = l;
}
else
{
largest=i;
}


if(r<=size&&a[r]>a[largest])
{
largest=r;
}
if(largest!=i)
{
exchange(a[i],a[largest]);
max_heapify(a,largest,size);
}
}


//--------------------------
template<typename T>
void build_max_heap(T a[],int size)
{
for(int i=size/2;i>=1;--i)
{
max_heapify(a,i,size);
}
}


//--------------------------
template<typename T>
void heapsort(T a[],int size)
{
build_max_heap(a,size);
for(int i =size;i>=2;--i )
{
exchange(a[1],a[i]);
size=size-1;
max_heapify(a,1,size);
}
}

//----------------------例如----------------------

{

int data[]={0,8,5,4,6,13,7,1,9,12,11,3,10,2};//数组第一个元素不考虑

  for(int i=1;i<14;i++)
     {
        printf("%d ",data[i]);
     }

  heapsort(data,13);
   for(int i=1;i<14;i++)
     {
        printf("%d ",data[i]);
     }
  system("PAUSE"); 
return 0;

}



//--------------------------最小堆--只需要更改这个函数----------

template<typename T>
void max_heapify(T a[],int i,int size)
{
int l=left(i);
int r = right(i);
int largest = 0;
if(l<=size&&a[l]<a[i])
{
largest = l;
}
else
{
largest=i;
}


if(r<=size&&a[r]<a[largest])
{
largest=r;
}
if(largest!=i)
{
exchange(a[i],a[largest]);
max_heapify(a,largest,size);
}
}

//-----------------------------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值