经典算法
class HeapSort {
public:
int* heapSort(int* A, int n) {
// write code her
maxheap(A,n);
for(int i=n-1;i>=0;i--){
swap(A[0],A[i]); //大根堆堆顶元素为堆中最大的,将堆顶元素移到数组尾部,并且将最后一个元素移过来,重新调整(n-1)个数的大根堆
fixdown(A,0,i);
}
return A;
}
void maxheap(int num[],int n) //建立大根堆,从倒数第一个父节点开始调整
{
int i;
for(i=n/2-1;i>=0;i--){
fixdown(num,i,n-1);
}
}
void fixdown(int nums[],int i,int n) //堆调整
{
int j,temp;
int flag=1;
while(2*i+1<n && flag)
{
if(2*i+2>n-1) j=2*i+1; //首先选择头结点的两个子节点中较大的一个
else if(nums[2*i+1]<nums[2*i+2] && i*2+2< n) j=2*i+2;
else j=2*i+1;
if(nums[i]<nums[j]) //如果头结点小于较大节点,则交换位置,因为之前的位置是调整好的,所以只需要调整num[i]即可,重复操作直到新加入节点下沉到一个合适的位置
{
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
i=j;
}
else flag=0;
}
}
};