首先建堆:假设序列中元素个数为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;
}

 

posted on 2018-04-08 14:04  Sunshine&暖阳  阅读(133)  评论(0编辑  收藏  举报