堆排序(小顶堆)

7-12 排序 (25 分)

给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。

本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:

 

  • 数据1:只有1个元素;

     

     

  • 数据2:11个不相同的整数,测试基本正确性;

     

     

  • 数据3:103个随机整数;

     

     

  • 数据4:104个随机整数;

     

     

  • 数据5:105个随机整数;

     

     

  • 数据6:105个顺序整数;

     

     

  • 数据7:105个逆序整数;

     

     

  • 数据8:105个基本有序的整数;

     

     

  • 数据9:105个随机正整数,每个数字不超过1000。

     

    输入格式:

    输入第一行给出正整数N(105​​),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。

    输出格式:

    在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。

    输入样例:

    11
    4 981 10 -17 0 -20 29 50 8 43 -5
    

    输出样例:

    -20 -17 -5 0 4 8 10 29 43 50 981

 

 

#include <iostream>
using namespace std;
int N;
long h[100001];
    void swap(int &a, int &b){
        long temp = h[a];
        h[a] = h[b];
        h[b] = temp;
    }
    void siftdown(int i){//向下调整 
        int t, flag = 0;//flag 用来标记是否向下调整 
        //t用来记录值较小的点的下标 
        while(i * 2 <= N && !flag){
            if(h[i] > h[i * 2]){
                t = i * 2;
            }else{
                t = i;
            }
            if(i * 2 + 1 <= N){
                if(h[t] > h[i * 2 + 1]){
                    t = i * 2 + 1;
                }
            } 
            
            if(t != i){
                swap(t, i);
                i = t;
            }else{
                flag = 1;
            }
        }
    }
    void creat(){
        for(int i = N / 2; i >= 1; i--){
            siftdown(i);
        }
    } 
    long del(){
        long t = h[1];
        h[1] = h[N];
        N--;
        siftdown(1);
        return t;
    }    



int main(){
    
    cin >> N;
    int num = N;
    for(int i = 1; i <= num; i++){
        cin >> h[i];
    }
    creat();
    for(int i = 1; i <= num; i++){
        if(i == 1){
            cout << del();
        }else{
            cout << " " << del();
        }
    }
    return 0;
}

 

posted @ 2019-03-05 10:09  kakaluotedj  阅读(777)  评论(0)    收藏  举报