堆排序

#include<iostream>
using namespace std;
int heap_size=10;
void exchange(int *a,int *b)
{
int t=*a;
*a=*b;
*b=t;
}
void max_heapify(int *a,int i)//维持某个结点为最大堆
{
if(i<heap_size/2)///?
return ;
int left=2*i;
int right=2*i+1;
int largest;
if(left<=heap_size&&a[left]>a[i])
largest=left;
else
largest=i;
if(right<=heap_size&&a[right]>a[largest])
largest=right;
if(largest!=i)
{
exchange(&a[i],&a[largest]);
max_heapify(a,largest);
}
}
void build_max_heapify(int *a)//建最大堆
{
int len=heap_size;
for(int i=len/2;i>0;--i)
max_heapify(a,i);

}
void print(int *a)
{
int len=heap_size;
for(int i=0;i<len;++i)
cout<<a[i]<<"  ";
cout<<endl;
}
void heapsort(int *a)
{
build_max_heapify(a);
for(int i=heap_size;i<=2;--i)//堆排序
{
exchange(&a[1],&a[i]);
heap_size=heap_size-1;
max_heapify(a,1);
}

}
int  heap_extract_max(int *a)//去掉最大值,并返回最大值
{
if(heap_size<1)
cout<<"heap overflow"<<cout<<endl;
int max=a[1];
a[1]=a[heap_size];
--heap_size;
max_heapify(a,1);
return max;
}
void heap_increase_key(int *a,int i,int key)//在i位置将关键字增加为key,只能是增加,若key小于a[i],则操作无效
{
if(key<a[i])
cout<<"new key is smaller than current key"<<endl;
else
{
a[i]=key;
while(i>1&&a[i/2]<a[i])
    {
    exchange(&a[i],&a[i/2]);
    i=i/2;
    }
}
}

void max_heap_insert(int *a,int key)
{
++heap_size;
a[heap_size]=-1000;//首先扩大堆的大小,并把增加的新位置的值设为极小值,以保证正确值的插入
heap_increase_key(a,heap_size,key);
}
int main()
{
int a[15]={0,4,1,3,2,16,9,10,14,8,7};
heapsort(a);
print(a+1);
int max=heap_extract_max(a);
cout<<"max: "<<max<<endl;
print(a+1);
heap_increase_key(a,5,13);
print(a+1);
max_heap_insert(a,666);
print(a+1);
return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值