Cod sursa(job #3339047)

Utilizator TimofeiFilipTimofei Filip Emanuel TimofeiFilip Data 5 februarie 2026 21:40:40
Problema Sortare prin comparare Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include<bits/stdc++.h>
#include<random>
#pragma GCC optimise("Ofast, O3, unroll-loops")
using namespace std;


void QuickSort(vector<int> &v, int left, int right){
    if (left >= right) return;

    int pivot_position = left + rand() % (right - left + 1);
    int pivot = v[pivot_position];
    swap(v[left], v[pivot_position]);

    int valori_mai_mici = 0;
    for(int i = left + 1; i <= right; i++){
        valori_mai_mici += (v[i] < pivot);
    }

    int poz_pivot = left + valori_mai_mici;
    swap(v[left], v[poz_pivot]);

    int i = left, j = right;
    while(i < poz_pivot && j > poz_pivot){
        while(v[i] < pivot) i++;
        while(v[j] >= pivot) j--;
        if(i < poz_pivot && j > poz_pivot)
            swap(v[i], v[j]);
    }

    QuickSort(v, left, poz_pivot - 1);
    QuickSort(v, poz_pivot + 1, right);
}
int main(){
    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);


    int n;
    scanf("%d", &n);

    vector<int> v(n + 1, 0);
    for(int i = 1; i <= n; i++){
        scanf("%d", &v[i]);
    }
    srand(2027);

    for (int i = 1; i <= n; ++i) {
        int poz_aleatoare = rand() % i + 1; // [1, i]
        swap(v[i], v[poz_aleatoare]);
    }

    QuickSort(v, 1, n);

    for(int i = 1; i <= n; i++){
        printf("%d ", v[i]);
    }
    return 0;
}