小顶堆
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<string.h> using namespace std; #define maxn 200000 int H,a[maxn]; void maxHeapify(int i) { int l,r,largest; l=2*i; r=2*i+1; if(l<=H&&a[l]>a[i]) largest=l; else largest=i; if(r<=H&&a[r]>a[largest]) largest=r; if(largest!=i) { swap(a[i],a[largest]); maxHeapify(largest); } } int main() { cin>>H; for(int i=1;i<=H;i++) { scanf("%d",&a[i]); } for(int i=H/2;i>=1;i--) maxHeapify(i); for(int i=1;i<=H;i++) { cout<<a[i]<<" "; } cout<<endl; return 0; } //10 //4 1 3 2 16 9 10 14 8 7
大顶堆
#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;
}
浙公网安备 33010602011771号