#include<iostream>
using namespace std;
void maxHeap(int *a,int i,int heapSize)
{
int l = 2*i;
int r = 2*i+1;
int largest=0;
if(l<=heapSize&&a[l-1]>a[i-1]) //左孩子大于父节点
largest = l;
else
largest = i;
if(r<=heapSize&&a[r-1]>a[largest-1]) //若右孩子比左孩子、父节点都大
largest = r;
if(largest!=i)
{
swap(a[i-1],a[largest-1]);
maxHeap(a,largest,heapSize); //检测孩子树
}
}
void buildMaxHeap(int *a,int heapSize)
{
for(int i=heapSize/2;i>=1;--i) //从heapSize/2开始建堆
maxHeap(a,i,heapSize);
}
void heapSort(int *a,int heapSize)
{
buildMaxHeap(a,heapSize); //建堆
for(int i=heapSize;i>=2;--i)
{
swap(a[0],a[i-1]);
--heapSize;
maxHeap(a,1,heapSize); //调整
}
}
void print(int *a,int num)
{
for(int i=0;i<num;++i)
cout<<a[i]<<ends;
}
int main()
{
int a[]={16,4,10,14,7,9,3,2,8,1};
int num = sizeof(a)/sizeof(a[0]);
heapSort(a,num);
print(a,num);
return 0;
}
堆排序
最新推荐文章于 2023-09-21 13:21:58 发布