Cod sursa(job #2987764)

Utilizator AndreiKatsukiAndrei Dogarel AndreiKatsuki Data 2 martie 2023 20:16:28
Problema Sortare prin comparare Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("algsort.in");
ofstream g("algsort.out");

const int NMAX = 5e5 + 5;
int n, a[NMAX];

void afisare(){
    for(int i=1;i<=n;++i){
        g << a[i] << " ";
    }
}

int medianOfThree(int a, int b, int c){
    if((a < b && b < c) || (c < b && b < a)){
       return b;
    }
    else if((b < a && a < c) || (c < a && a < b)){
       return a;
    }
    else{
       return c;
    }
}

void quicksort(int a[], int st, int dr){
    if(st < dr){
        // int range = dr - st + 1;
        // int m1 = (rand() % range) + st, m2 = (rand() % range) + st, m3 = (rand() % range) + st;
        // int pivot = medianOfThree(a[m1], a[m2], a[m3]);
        // int poz;
        // if(pivot == a[m1]){
        //     poz = m1;
        // }
        // else if(pivot == a[m2]){
        //     poz = m2;
        // }
        // else{
        //     poz = m3;
        // }
        int pivot = a[(st + dr) / 2], poz = (st + dr) / 2;
        int i = st - 1;
        for(int j=st;j<=dr;++j){
            if(a[j] < pivot){
                i++;
                if(i == poz){
                    poz = j;
                }
                swap(a[i], a[j]);
            }
        }
        swap(a[++i], a[poz]);
        quicksort(a, st, i - 1);
        quicksort(a, i + 1, dr);
    }
}

int main(){
    f >> n;
    for(int i=1;i<=n;++i){
        f >> a[i];
    }
    quicksort(a, 1, n);
    afisare();
    return 0;
}