static void max_heapify(int * arr, unsigned int beginPos, unsigned int length)
{
unsigned int largest = 0;
unsigned int left = 0;
unsigned int right = 0;
unsigned int tempPos = 0;
int tempNum = 0;
for(tempPos = beginPos, largest = tempPos; tempPos * 2 + 1 < length; tempPos = largest)
{
left = tempPos * 2 + 1;
right = (tempPos + 1) * 2;
/* 循环条件保证,l-child必定在范围内 */
if(arr[tempPos] < arr[left])
{
largest = left;
}
if(right < length)
{
if(arr[largest] < arr[right])
{
largest = right;
}
}
if(largest == tempPos)
{
break;
}
else
{
tempNum = arr[tempPos];
arr[tempPos] = arr[largest];
arr[largest] = tempNum;
}
}
return;
}
static void build_max_heap(int * arr, unsigned int length)
{
unsigned heapifyPos = 0;
for(heapifyPos = (length - 2)/2;heapifyPos >= 0; --heapifyPos)
{
max_heapify(arr, heapifyPos, length);
if(heapifyPos == 0)
{
break;
}
}
return;
}
int heap_sort(int * arr, unsigned int length)
{
unsigned int heapLast = 0;
int tempNum = 0;
if(arr == NULL)
{
return -1;
}
if(length < 2)
{
return 0;
}
build_max_heap(arr, length);
for(heapLast = length - 1; heapLast > 0; --heapLast)
{
tempNum = arr[0];
arr[0] = arr[heapLast];
arr[heapLast] = tempNum;
max_heapify(arr,0, heapLast);
}
return 0;
}