首先建堆:假设序列中元素个数为n,由于完全二叉树的叶子节点个数为n/2(向上取整),所以数组下标在【1,n/2】范围内的结点都是非叶子结点
堆顶元素最大,所以每次取最后一个元素替换置堆顶,在进行从【1,i-1】范围的向下调整
#include<cstdio> #include<cmath> #include<cstring> #include<iostream> #include<cstdlib> #include<algorithm> #include<string> #include<stack> #include<queue> #include<map> #define MAX 110 using namespace std; int heap[MAX]; int n; void downAdjust(int low,int high){ int i=low,j=i*2; while(j<=high){ if((j+1<=high)&&heap[j+1]>heap[j]) j=j+1; if(heap[i]<heap[j]){ swap(heap[i],heap[j]); i=j; j=i*2; }else{ break; } } } void CreateHeap(){ for(int i=n/2;i>=1;i--) downAdjust(i,n); } void HeapSort(){ CreateHeap(); for(int i=n;i>1;i--){ swap(heap[i],heap[1]); downAdjust(1,i-1); } } int main(){ scanf("%d",&n); //堆排序的时候数组存放从1开始 //这样才能使2i为左孩子 for(int i=1;i<=n;i++) scanf("%d",&heap[i]); HeapSort(); for(int i=1;i<=n;i++) printf("%d ",heap[i]); return 0; }