堆排序
来源:互联网 发布:pip linux 编辑:程序博客网 时间:2024/05/16 18:18
#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;}
对于给定的数组 进行堆排序 从小到大