Cod sursa(job #1839078)

Utilizator mdiannnaMarusic Diana mdiannna Data 2 ianuarie 2017 14:03:56
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.45 kb
#include <iostream>
#include <cmath>
#include <climits>

//#define INT_MAX 2147483647

using namespace std;
int A[500010];
int B[500005];
int N;

 int lung_bloc, nr_bloc;

void calcMin(){
    int j = 0;
    int minim = 0;

    for(int i=0; i<nr_bloc; i++){
        minim = A[j];
        for(int k=0; k<lung_bloc; k++){
            if(A[j] < minim)
                minim = A[j];
            j++;
        }

        B[i] = minim;
    }


}


int query(int st, int dr){

    int st_bloc = st/lung_bloc;
    int dr_bloc = dr/lung_bloc;

    int minim = A[st];
    while((st % lung_bloc)!=0 && (st <= dr)){
        if(A[st] < minim)
            minim = A[st];
        st++;
    }
    while(((dr+1)%lung_bloc!=0) && (dr > st)){
        if(A[dr] < minim)
            minim = A[dr];
        dr--;
    }

    if((dr - st+1) >= lung_bloc )
        for(int i=st_bloc; i<=dr_bloc; i++)
            if(B[i] < minim)
                minim = B[i];

    return minim;
}


void update_bloc(int i, int minim){
        int k = i* lung_bloc;
        int j= k;


        for(int k=0; k<lung_bloc; k++){
            if(A[j] == minim){
                A[j] = INT_MAX;
                break;
            }
            j++;
        }


        j=k;

        minim = A[j];
        for(int k=0; k<lung_bloc; k++){
            if(A[j] < minim)
                minim = A[j];
            j++;
        }

        B[i] = minim;

}

void sort_batog(){

    for(int j=0; j<N; j++){
        bool flag = 0;
        int minim = B[0];
        int pos_min = 0;

        for(int i=0; i<nr_bloc; i++){
            if(B[i] < minim){
                minim = B[i];
                pos_min = i;
            }
        }


        if(nr_bloc*lung_bloc < N){
            for(int i=nr_bloc*lung_bloc; i<N; i++){
                if(A[i] < minim){
                    minim = A[i];
                    pos_min = i;
                    flag = 1;
                }
            }
        }

        if(flag == 1){
            A[pos_min] = INT_MAX;
        }
        else{
            B[pos_min] = INT_MAX;
             update_bloc(pos_min, minim);

        }


        printf("%d ", minim);
        }

}


int main()
{
    freopen("algsort.in","r", stdin);
    freopen("algsort.out","w", stdout);

    scanf("%d", &N);
    for(int i=0; i<N; i++)
        scanf("%d", &A[i]);

    lung_bloc = sqrt(N);
    nr_bloc = N/lung_bloc;

    calcMin();
    /*for(int i=0; i<N/(int)sqrt(N); i++)
        cout << B[i] << " ";
    */

    sort_batog();



    return 0;
}