Cod sursa(job #3211145)

Utilizator pascarualexPascaru Alexandru pascarualex Data 8 martie 2024 16:43:35
Problema Sortare prin comparare Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include<cmath>
#include<fstream>

std::ifstream cin("algsort.in");
std::ofstream cout("algsort.out");

int n, v[500004];


///MergeSort
void merge(int v[], int st, int dr){

    int i = st, j, k=0, aux[500004];
    int mijl = (st + dr) / 2;

    j = mijl + 1;

    while( i <= mijl && j <= dr){
        if(v[i] < v[j]){
            aux[++k] = v[i++];
        }else {
            aux[++k] = v [j++];
        }
    }

    if(i <= mijl)
        for( j=i; j <= mijl; j++)
            aux[++k] = v[j];
    else for(i = j ; i <= dr ; i++)
            aux[++k] = v[i];
    for(int i = st, j = 1 ; i <= dr ; i++, j++)
        v[i] = aux[j];

}

void merge_sort(int v[], int st, int dr){
    if(dr - st > 1){

        int mijl = (st + dr) / 2;

        merge_sort(v, st, mijl);
        merge_sort(v,mijl+1, dr);
        merge(v, st, dr);
    }else{
        if(v[st] > v[dr])
            std::swap(v[st],v[dr]);
    }
}

///MergeSort

///QuickSort

void quicksort(int v[], int st, int dr) {

    if (st < dr) {

        int mijl = st + std::rand() % (dr - st + 1);

        std::swap(v[mijl], v[st]);

        int i = st, j = dr, d = 0;

        while (i < j) {
            if (v[i] > v[j]) {
                std::swap(v[i], v[j]);
                d = 1 - d;
            }
            i += d;
            j -= 1 - d;
        }

        quicksort(v, st, i - 1);
        quicksort(v, i + 1, dr);
    }
}

///QuickSort

int main(){

    cin>>n;

    for(int i=1; i <= n; i++)
        cin >> v[i];

    quicksort(v,1,n);

    for(int i=1; i <= n; i++)
        cout << v[i] << " ";
}