void minHeapFixDown(int a[], int i, int n) /* 从第i个结点开始调整以i为根的树 */
{
int j, tmp;
tmp = a[i]; /* 把i抽出,挖坑 */
j = 2 * i + 1; /* 左孩子 */
while(j < n)
{
if(j+1 < n && a[j+1] < a[j]) /* 在左右孩子中找到最小的 */
j++;
if(a[j] >= tmp)
break;
a[i] = a[j]; /* 填坑 */
i = j; /* 新的坑 */
j = 2 * i + 1;
}
a[i] = tmp;
}
void makeMinHeap(int a[], int n) /* 建堆 */
{
int i;
for(i = n / 2 - 1; i >= 0; i--)
minHeapFixDown(a, i, n);
}
void minHeapSort(int a[], int n)
{
int i, tmp;
for(i = n - 1; i >= 1; i--)
{
tmp = a[0];
a[0] = a[i];
a[i] = tmp;
minHeapFixDown(a, 0, i);
}
}
void heap_sort(int array[], int num)
{
makeMinHeap(array, num);
minHeapSort(array, num);
}