Cod sursa(job #1537230)

Utilizator ThomasFMI Suditu Thomas Thomas Data 27 noiembrie 2015 01:56:56
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
using namespace std;

#define READ_FROM_FILE

int qs_partition(int l, int r, vector<int> &v)
{
    int poz = rand() % (r-l+1) + l; // alegem pivot random
    int pivot = v[poz]; // retinem valoare pivotului

    int nr = 0; // numere <= cu pivotul
    swap(v[poz], v[r]); // mutam pivotul in dreapta

    // ducem in stanga toate numerele <= cu pivotul
    for(int i=l;i<r;++i)
        if(v[i] <= pivot)
            swap(v[l+(++nr)-1], v[i]);

    // mutam pivotul pe pozitia corecta
    swap(v[l+nr], v[r]);

    // returnam pozitia finala a pivotului
    return l+nr;
}

void quick_sort(int l, int r, vector<int> &v)
{
    if(l < r)
    {
        int p = qs_partition(l, r, v);
        quick_sort(l, p-1, v);
        quick_sort(p+1, r, v);
    }
}

int main()
{
    #ifdef READ_FROM_FILE
        freopen("algsort.in","r",stdin);
        freopen("algsort.out","w",stdout);
    #endif // READ_FROM_FILE

    int N, x;
    vector<int> v;

    cin>>N;
    srand(N);
    while(N--)
    {
        cin>>x;
        v.push_back(x);
    }

    quick_sort(0, v.size()-1, v);

    for(auto x : v) cout<<x<<" ";

    return 0;
}