Cod sursa(job #2493366)

Utilizator DysKodeTurturica Razvan DysKode Data 16 noiembrie 2019 11:51:53
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.01 kb
#include <bits/stdc++.h>

using namespace std;

int v[500010], aux[500010], i, j, n;

/// [1, n]
void merge_sort( int st, int dr )
{
    if( dr <= st )
        return;
    int mij = (st + dr) / 2;
    merge_sort(st, mij);
    merge_sort(mij+1, dr);
    int ps = st, pd = mij + 1;
    int i = 1;
    while( ps <= mij || pd <= dr )
    {
        if( ps <= mij && pd <= dr )
        {
            if( v[ps] <= v[pd] )
            {
                aux[ i ] = v[ps];
                ps++;
            }
            else
            {
                aux[ i ] = v[pd];
                pd++;
            }
        }
        else if( ps <= mij )
        {
            aux[ i ] = v[ps];
            ps++;
        }
        else
        {
            aux[ i ] = v[pd];
            pd++;
        }
        i++;
    }
    for(int i = st ; i <= dr ; i++)
    {
        v[ i ] = aux[ i - st + 1 ];
    }
}

void quick_sort( int st, int dr )
{
    if( dr == st + 1 )
    {
        if( v[st+1] < v[st] )
            swap( v[st+1], v[st] );
    }
    if( dr <= st ) return;
    int pivot = st + rand() % (dr-st);
    pivot = v[ pivot ];
    int ps = st, pd = dr;
    while( ps < pd )
    {
        while( ps < dr && v[ps] <= pivot )
            ps++;
        while( pd > st && v[pd] > pivot )
            pd--;
        if( ps <= pd && v[ps] > pivot && v[pd] <= pivot  )
            swap( v[ps], v[pd] );
    }
    int pozp, mici=0;
    for(int i = st ; i <= dr ; i++)
    {
        if( v[i] == pivot )
            pozp = i;
        if( v[i] <= pivot )
            mici++;
    }
    swap( v[pozp], v[st+mici-1] );
    quick_sort( st , st+mici-2 );
    quick_sort( st + mici, dr );
}


int main()
{
    ifstream cin("algsort.in");
    ofstream cout("algsort.out");
    srand(time(0));
    cin >> n;
    for(int i = 1 ; i <= n ; i++)
    {
        cin >> v[i];
    }
    quick_sort(1, n);
    for(int i = 1 ; i <= n ; i++)
    {
        cout << v[i] << ' ';
    }

    return 0;
}