堆排序使用大顶堆,大顶堆的第一个元素是最大值,这样在排序的时候(假设共n个节点),直接将第一个元素和最后一个元素进行交换,然后从第一个元素开始进行向下调整至第n-1个元素。堆排序的步骤分为三步:
1、建堆(建大堆)
2、交换数据
3、向下调整
/*******************
堆排序
***********************/
template<class T>
void HeapAdjust(T arr[],int index,int number)//调整堆,从而形成一个大顶堆
{
int j = index*2 +1;//子节点
while(j<number)
{
if (j+1<number && arr[j]<arr[j+1])//找到子节点中较大的一个
{
j++;
}
if (arr[index] >= arr[j])//父节点比子节点大,无需再继续比较
{
break;
}
swap(arr[index],arr[j]);
index = j;
j = 2*j +1;//查找下一层
}
}
template<class T>
void HeapSort(T arr[],int length)
{
int i;
for (i=length/2-1;i>=0;i--)//创建大顶堆,只对有子节点的节点进行调整
{
HeapAdjust(arr,i,length);
}
for (i=length;i>=0;i--)
{
swap(arr[0],arr[i]);//将大顶堆的最大值放到队尾
HeapAdjust(arr,0,i);
}
}