#include <iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
// 构造大顶堆
// a 是要进行调整的堆数组 i是从第i个元素开始调整(其实就是最靠后的一个不是叶子节点的节点)
// size是要进行调整的对数组的元素个数 用于确定在往下递归的时候不越界
// 这是在调整堆的时候的单独调用模块就是 调整单个节点的模块
void heapAdjust(int *a,int i,int size)
{
int lchild = 2*i;
int rchild = 2*i+1;
int max = i;
if(i<=size/2)
{
if(lchild<=size&&a[lchild]>a[max])
{
max = lchild;
}
if(rchild<=size&&a[rchild]>a[max])
{
max = rchild;
}
if(max!=i)
{
swap(a[max],a[i]);
heapAdjust(a,max,size);
}
}
}
// 用于建立堆 调用上面的模块
void buildHeap(int *a,int size)
{
//采用倒序的方式调整堆 这是在建立堆的时候比较优秀的做法
//这是在静态的维护一个堆 如果动态的维护一个堆 有添加元素 和删除元素的话
//删除堆顶元素 向下一步一步调整 通过while就行了 因为只是在原有堆的基础上改动一下
//所以动作较小 沿着一条路下去就行了 这里是在一个数组中维护这个堆
//其实在排序的时候思路是一致的
for(int i=size/2;i>=1;i--)
{
heapAdjust(a,i,size);
}
}
void heapSort(int *a,int size)
{
buildHeap(a,size);
for(int i=size;i>=1;i--)
{
//cout<<a[1]<<" ";
swap(a[1],a[i]);
heapAdjust(a,1,i-1);
}
}
int main()
{
int a[100];
int size;
while(scanf("%d",&size)==1&&size!=0)
{
for(int i=1;i<=size;i++)
{
cin>>a[i];
}
heapSort(a,size);
for(int i=1;i<=size;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
return 0;
}
对于给定的数组 进行堆排序 从小到大
堆排序
最新推荐文章于 2024-09-04 23:05:17 发布