#include<iostream>
using namespace std;
//大顶堆
template<typename Type>
void HeapAdjust(Type *array,int i,int size)
{
int lchild = 2*i+1; //i元素的左孩子节点
int rchild = 2*i+2; //i元素的右孩子节点
int max = i;
if(i<=size/2)//是叶子节点的不用堆调整
{
if(lchild<=size && array[lchild] > array[max] ) //找i、2i+1、2i+2三个节点中最大的 元素,与i交换。
{
max = lchild;
}
if(rchild<=size && array[rchild] >array[max])
{
max = rchild;
}
if(max!= i) //如果发生交换,重新调整堆
{
swap(array[i],array[max]);
HeapAdjust(array,max,size); //避免调整之后以max为父节点的子树不是堆
}
}
}
template<typename Type>
void HeapSort(Type *array,int len)
{
if(array==NULL || len<=0)
{
return;
}
for(int i=len/2-1;i>=0;--i) //建立初始堆,从非叶子节点开始调整。
{
HeapAdjust(array,i,len-1);
}
for(int i=len-1;i>=0;--i)//从最后一个元素开始,与堆顶元素交换(此时是大顶堆,大元素依次交 换到后面有序数组)。
{
swap(array[i],array[0]); //堆顶元素array[0]依次向下交换
HeapAdjust(array,0,i-1); //交换元素之后要重新调整栈顶a[0]元素的位置,保证为堆
}
}
void main()
{
int a[8] = {4,7,45,8,45,100,0,55};
HeapSort(a,8);
for(int i=0;i<8;++i)
{
cout<<a[i]<<" ";
}
cout<<endl<<endl;
system("pause");
}
05-28
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交