您的位置:首页 > 其它

堆排序

2015-10-11 22:20 337 查看
#include<iostream>
using namespace std;
int left(int i)
{
return 2*i;
}//左孩子
int right(int i)
{
return 2*i+1;
}右孩子
void print_array(int *a,size_t length)
{
for(size_t i = 1;i < length;i++)
{
cout<<a[i]<<" ";
}

}//输出数组
void heap_modify(int *a,int i,int heapsize)
{

while(i<=heapsize)
{
int l =left(i);
int r = right(i);
int largest=i,temp;
if(l<=heapsize&&a[i]<a[l])
largest =l ;
if(r<=heapsize&&a[largest]<a[r])
largest =r ;//得到左右孩子中的最大值
if(i==largest)break;
temp=a[largest];
a[largest] = a[i];
a[i]  = temp;//交换
i = largest;//下一个节点
//print_array(a,11);
//cout<<endl;
//cout<<largest <<" ";
}
}
void built_heap(int *a,int length)
{
for(size_t i = length/2;i>0;i--)
{
heap_modify(a,i,length);

}

}//建堆
void heap_sort(int *a,int length)
{
built_heap(a,length);
int heapsize = length-1;
for(size_t i = length-1;i>=2;i--)
{
int temp;
temp = a[1];
a[1] = a[i];
a[i] = temp;
heapsize--;
heap_modify(a,1,heapsize);//最大值拿掉,重新建堆

}

}

int main()
{
int a[11] = {0,10,9,8,7,6,5,4,3,2,1};//数组下标0位不使用,从1位开始
cout<<"before heapsort"<<endl;
print_array(a,11);
cout<<endl;
heap_sort(a,11);;
cout<<"after heapsort"<<endl;
print_array(a,11);

}
//解释如注释
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: