/*
7.堆排序
最佳情况:T(n) = O(nlogn)
最差情况:T(n) = O(nlogn)
平均情况:T(n) = O(nlogn)
*/
/* 从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2 n是数组的大小*/
void MinHeapFixdown(int a[], int i, int n) {
for(int j = 2 * i + 1; j < n; i = j, j = 2 * i + 1) {
if (j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的
j++;
if (a[j] >= a[i])
break;
swap(a[i], a[j]);
}
}
void MinheapsortTodescendarray(int a[], int n) {
//建立最小堆
for (int i = n / 2 - 1; i >= 0; i--)
MinHeapFixdown(a, i, n);
//对最小堆进行删除操作,即排序
for (int i = n - 1; i >= 1; i--) {
swap(a[i], a[0]);
MinHeapFixdown(a, 0, i);
}
}