#define Heap_Sort
#ifdef Heap_Sort
#define LT(a,b) (a<b)
void HeapAdjust(int *pArr,int s,int m)
{
int rc = 0;
int j = 0;
rc = pArr[s];
for(j = 2*s+1;j<m;j=2*j+1)
{
if(j<m-1&<(pArr[j],pArr[j+1]))
{
j++;
}
if(!LT(rc,pArr[j]))
{
break;
}
pArr[s] =pArr[j];
s = j;
}
pArr[s] = rc;
}
void HeapSort(int *pArr,int length)
{
int i = 0;
int tmp = 0;
for(i = length/2-1;i>=0;i--)
{
HeapAdjust(pArr,i,length);
}
for(i = length;i>1;--i)
{
tmp = pArr[0];
pArr[0] =pArr[i-2];
pArr[i-2] = tmp;
HeapAdjust(pArr,0,i-2);
}
}
int main(int argc,char** argv)
{
/*int arr[] = {49,38,65,97,76,13,27,49,0};*/
int arr[] = {4,1,3,2,16,9,10,14,8,7,0};
HeapSort(arr,sizeof(arr)/sizeof(arr[0]));
for(int i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%2d ",arr[i]);
}
getchar();
return 0;
}
#endif
关键是要先理解整个堆排序的过程,画出完全二叉树的迁移过程图,然后进行调试,调试过程中的索引是个让人很头疼的问题。