1. 代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void AdjustDown(int *A,int i,int len)
{
int tempval = A[i];
for(int k = 2*i+1;k<len;k = k*2+1)
{
if(k<len-1&&A[k] < A[k+1])
{
k++;
}
if(tempval >= A[k])
{
break;
}
else
{
A[i] = A[k];
i = k;
}
}
A[i] = tempval;
}
void BuildMaxHeap(int *A,int len)
{
for(int i = (len/2)-1;i>=0;i--)
{
AdjustDown(A,i,len);
}
}
void heapsort(int *A,int len,int k,int **retArray,int *returnSize)
{
BuildMaxHeap(A,len);
for(int i = len;i >=len - k +1;i--)
{
*retArray = (int*)realloc(*retArray,sizeof(int)*( (*returnSize)+1 ) );
(*retArray)[(*returnSize)++] = A[0];
Swap(&A[i-1],&A[0]);
AdjustDown(A,0,i-1);
}
}
int main()
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
int *result = NULL;
int resultSize = 0;
heapsort(a,sizeof(a)/sizeof(int),5,&result,&resultSize);
printf("the retarray size is %d\n",resultSize);
for(int i =0 ;i < 5;i++)
{
printf("%d\n",result[i]);
}
system("pause");
}
比较成功,满足条件,则不是互换A[i]与A[k]的值,
而是确定了A[k]的值,由于大小顶堆的性质,
要所有节点都满足((A[i]<A[2i])&&(A[i]<A[2i+1]))或者
((A[i]>A[2i])&&(A[i]>A[2i+1])),因此,A[i]的值要在已经到了跳出条件才能确定,
从而我们记录在调整开始前记录的A[0]=A[k]是很重要的。