#include<iostream> #include<algorithm> using namespace std; void MinHeapFixdown(int a[], int i, int n)//调整堆 { int j, temp; temp = a[i]; j = 2 * i + 1;//i节点的左孩子节点 while (j < n)// 左孩子小于总数 { if (j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的 右孩子节点小于左孩子 j++; //此时j是右孩子 //没有右孩子或者右孩子大于左孩子 最小的就是左孩子 if (a[j] >= temp) //最小的孩子节点大于父节点 就无需调整 break; a[i] = a[j]; //把较小的子结点往上移动,替换它的父结点 i = j;//i更新为孩子节点 j = 2 * i + 1; //j更新为新的i的左孩子节点 } a[i] = temp;//找到合适位置赋给a[i] } void MakeMinHeap(int a[], int n)//初始化最小堆 { for (int i = n / 2 - 1; i >= 0; i--) MinHeapFixdown(a, i, n); } void MinheapsortTodescendarray(int a[], int n) { for (int i = n - 1; i >= 1; i--) { swap(a[i], a[0]); MinHeapFixdown(a, 0, i); } } int main() { int a[100], n; cin>>n; for(int i = 0; i < n; i++) { cin>>a[i]; } MakeMinHeap(a, n); MinheapsortTodescendarray(a, n); for(i = 0; i < n; i++) cout<<a[i]<<‘ ‘; return 0; }
时间: 2024-10-31 12:21:18