// 交换两个元素 voidswap(int &a, int &b) { int temp = a; a = b; b = temp; }
// 调整堆,使其满足最大堆的性质 voidheapify(int a[], int n, int i) { int largest = i; // 初始化largest为根节点 int left = 2 * i + 1; // 左子节点 int right = 2 * i + 2; // 右子节点 // 如果左子节点大于根节点 if (left < n && a[left] > a[largest]) { largest = left; } // 如果右子节点大于目前的最大值 if (right < n && a[right] > a[largest]) { largest = right; } // 如果最大值不是根节点,则交换并继续调整堆 if (largest != i) { swap(a[i], a[largest]); heapify(a, n, largest); // 递归地调整受影响的子树 } }
// 堆排序函数 voidheapSort(int a[], int n) { // 构建最大堆(从最后一个非叶子节点开始向上调整) for (int i = n / 2 - 1; i >= 0; i--) { heapify(a, n, i); } // 一个个从堆顶取出元素 for (int i = n - 1; i > 0; i--) { // 将当前堆顶(最大值)移到数组末尾 swap(a[0], a[i]); // 对剩余的堆进行调整,使其重新满足最大堆的性质 heapify(a, i, 0); } }
intmain() { int n; cin >> n; int a[n]; for (int i = 0; i < n; i++) { cin >> a[i]; } heapSort(a, n); // 对整个数组进行堆排序 // 输出排序后的数组 for (int i = 0; i < n; i++) { cout << a[i] << " "; } cout << endl; return0; }