Cod sursa(job #2239168)

Utilizator danielsociuSociu Daniel danielsociu Data 9 septembrie 2018 19:03:05
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.94 kb
#include <fstream>
std::ifstream cin("algsort.in");
std::ofstream cout("algsort.out");
#define maxn 500050
int v[maxn],N;

// *****READ&OUT******
void afis(int v[],int n){
    for(int i=1;i<=n;i++)
        cout<<v[i]<<' ';
}
void citire(int v[],int &n){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>v[i];
}
// *****READ&OUT******
/*
// *********QUICKSORTS****************
//DEI type
void quicksort(int v[],int st, int dr){
    if(st<dr){ //average 40 pct
        int i=st, aux;
        int rad=v[dr];
        for(int j=st;j<dr;j++)
            if(v[j]<rad){
                std::swap(v[i],v[j]);
                i+=1;
            }
        v[dr]=v[i];
        v[i]=rad;
        quicksort(v,st,i-1);
        quicksort(v,i+1,dr);
    }
}
void quicksort_medianOfThree(int v[],int st, int dr){
    if(st<dr){//best 40pct slightly better than ^
        int med=(st+dr)/2;
        if(v[st]>v[med])
            std::swap(v[st],v[med]);//most efficient
        if(v[st]>v[dr]) //swap really slows down algorithm
            std::swap(v[dr],v[st]);
        if(v[med]>v[dr])
            std::swap(v[dr],v[med]);
        int rad=v[med], i=st+1;
        std::swap(v[med],v[dr-1]);
        for(int j=st+1;j<dr-1;j++)
            if(v[j]<rad){
                std::swap(v[i],v[j]);
                i+=1;
            }
        std::swap(v[i],v[dr-1]);
        quicksort(v,st,i-1);
        quicksort(v,i+1,dr);
    }
}
void updatedquicksort(int v[],int st, int dr){
    if(st<dr){ //worst quicksort 0pct inefficient
        int i=st,j=dr-1,rad=v[dr],aux;
        for(;;){
            while(v[i]<rad) i++;
            while(v[j]>rad) j--;
            if(i<j){
                aux=v[i];
                v[i]=v[j];
                v[j]=aux;
            }
            else
                break;
        }
        aux=v[i];
        v[i]=v[dr];
        v[dr]=aux;
        updatedquicksort(v,st,i-1);
        updatedquicksort(v,i+1,dr);
    }
}
// *************END**QUICKSORTS*******
*/
/*
// ******MERGESORT**********gets 100pct
//DEI type
void mergexd(int v[],int l, int m, int r){
    int n1,n2,i,j,k; //merge sort gets 100pct
    n1=m-l+1; // the length of the left side till middle
    n2=r-m; //length of right side

    int la[n1],ra[n2]; //create the temporary arrays

    for(int i=0;i<n1;i++)
        la[i]=v[l+i]; //initialize left array
    for(int i=0;i<n2;i++)
        ra[i]=v[m+i+1]; //initialize right array
    i=0;j=0; //index of temporaries arrays
    k=l;//index of official array
    while(i<n1&&j<n2){
        if(la[i]<ra[j]){
            v[k]=la[i];
            i++;
        }else{
            v[k]=ra[j];
            j++;
        }
        k++;
    }
    while(i<n1){
        v[k]=la[i];
        i++;k++;
    }
    while(j<n2){
        v[k]=ra[j];
        j++;k++;
    }
}

void merge_sort(int v[],int l,int r){
    if(l<r){
        int m=(l+r)/2;
        merge_sort(v,l,m);
        merge_sort(v,m+1,r);

        mergexd(v,l,m,r);
    }
}
// ********END**MERGESORT************
*/

/*
// *******SHELLSORT**********
// Surprisingly it gets 60 pct, very close to 100
void shellsort(int v[],int n){
    for(int gap=n/2;gap>0;gap/=2){
        for(int i=gap;i<=n;i++){
            int temp=v[i],j;
            for(j=i;j>=gap&&v[j-gap]>=temp;j-=gap)
                v[j]=v[j-gap];
            v[j]=temp;
        }
    }
}
// *******END**SHELLSORT*****
*/
void heapify(int v[],int n,int x){
    int largest=x;
    int l=2*x, r=2*x+1;

    if(l<=n&&v[largest]<=v[l])
        largest=l;
    if(r<=n&&v[largest]<=v[r])
        largest=r;
    if(largest!=x){
        std::swap(v[largest],v[x]);
        heapify(v,n,largest);
    }
}

void heapsort(int v[],int n){
    for(int i=n/2;i>0;i--)
        heapify(v,n,i);
    for(int i=n;i>0;i--){
        std::swap(v[1],v[i]);
        heapify(v,i-1,1);
    }
}

int main()
{
    citire(v,N);
    heapsort(v,N);
    afis(v,N);
}