
// 下沉调整函数
void sift_down(vector<int>& arr, int i, int n) {while (i < n) {int largest = i; // 当前节点int left = 2 * i + 1; // 左子节点int right = 2 * i + 2;// 右子节点// 找到左右子节点中的较大者if (left < n && arr[left] > arr[largest]) {largest = left;}if (right < n && arr[right] > arr[largest]) {largest = right;}// 若当前节点已最大,无需调整if (largest == i) break;// 否则交换,并继续向下调整swap(arr[i], arr[largest]);i = largest;}
}// 堆排序主函数
void heap_sort(vector<int>& arr) {int n = arr.size();// 构建初始最大堆(从最后一个非叶子节点开始调整)for (int i = n / 2 - 1; i >= 0; i--) {sift_down(arr, i, n);}// 逐个将堆顶元素(最大值)交换到末尾,并调整堆for (int i = n - 1; i > 0; i--) {swap(arr[0], arr[i]); // 将堆顶元素移到末尾sift_down(arr, 0, i); // 调整剩余元素为最大堆}
}
