大顶堆
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<string.h> using namespace std; #define maxn 200000 void AdjustDown(int arr[], int i, int n) { int j = i * 2 + 1;//子节点 while (j<n) { if (j+1<n && arr[j] > arr[j + 1])//子节点中找较小的 { j++; } if (arr[i] < arr[j]) { break; } swap(arr[i],arr[j]); i = j; j = i * 2 + 1; } } void MakeHeap(int arr[], int n)//建堆 { int i = 0; for (i = n / 2 - 1; i >= 0; i--)//((n-1)*2)+1 =n/2-1 { AdjustDown(arr, i, n); } } void HeapSort(int arr[],int len) { int i = 0; MakeHeap(arr, len); for (i = len - 1; i >= 0; i--) { swap(arr[i], arr[0]); AdjustDown(arr, 0, i); } } int main() { int H,a[1000]; cin>>H; for(int i=0;i<H;i++) { scanf("%d",&a[i]); } HeapSort(a,H); for(int i=0;i<H;i++) { cout<<a[i]<<" "; } cout<<endl; return 0; }
