Cod sursa(job #2204192)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 14 mai 2018 22:42:51
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <vector>

#include <cstdio>
using namespace std;

int partition(vector<int> *v, int left, int right)
{
    int mid = (left + right) / 2;
    if ((*v)[mid] < (*v)[right]) {
        if ((*v)[left] < (*v)[mid]) {
            swap((*v)[mid], (*v)[right]);
        }
        else if((*v)[left] < (*v)[right]) {
            swap((*v)[left], (*v)[right]);
        }
    }
    else {
        if ((*v)[mid] < (*v)[left]) {
            swap((*v)[mid], (*v)[right]);
        }
        else if((*v)[right] < (*v)[left]) {
            swap((*v)[left], (*v)[right]);
        }
    }

    int pivot = (*v)[right];
    int i = left - 1;
    
    for (int j = left; j < right; ++j) {
        if ((*v)[j] < pivot) {
            ++i;
            swap((*v)[i], (*v)[j]);
        }
    }

    ++i;
    swap((*v)[i], (*v)[right]);

    return i;
}

void quickSort(vector<int> *v, int left, int right)
{
    if (left >= right) {
        return;
    }

    int pivotPos = partition(v, left, right);

    quickSort(v, left, pivotPos - 1);
    quickSort(v, pivotPos + 1, right);
}

int main()
{
    freopen("algsort.in", "r", stdin);
    int n;
    scanf("%d", &n);
    vector<int> v(n);
    for (int i = 0; i < v.size(); ++i) {
        scanf("%d", &v[i]);
    }
    fclose(stdin);

    quickSort(&v, 0, n - 1);

    freopen("algsort.out", "w", stdout);
    for (int i = 0; i < v.size(); ++i) {
        printf("%d ", v[i]);
    }
    printf("\n");
    fclose(stdout);

    return 0;
}