#include <cstdio> #include <cstdlib> #include <stack> #include <algorithm> using namespace std; const int MAXN = 100000; int val[MAXN]; int n; void MinAdjust(int i, int n) { int j, temp = val[i]; j = 2 * i + 1; while (j < n) { if (j + 1 < n && val[j + 1] > val[j]) //在左右孩子中找最小的 j++; if (val[j] <= temp) break; val[i] = val[j]; //把较小的子结点往上移动,替换它的父结点 i = j; j = 2 * i + 1; } val[i] = temp; } void HeapSort() { for (int i = n / 2 - 1; i >= 0; i--) MinAdjust(i, n); for (int i = n - 1; i >= 1; i--) { swap(val[i], val[0]); MinAdjust(0, i); } } // HeapSort int main() { scanf("%d", &n); for (int i = 0;i < n;i++) { scanf("%d", &val[i]); } HeapSort(); for (int i = 0;i < n;i++) { printf("%d ", val[i]); } puts(""); return 0; } /************************************************************** Problem: 2176 User: admin Language: C++ Result: Accepted Time:37 ms Memory:1536 kb ****************************************************************/