Cod sursa(job #2083615)

Utilizator Andreiii500Andrei Puiu Andreiii500 Data 7 decembrie 2017 21:46:33
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
/// QuickSort
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;

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

const int N = 500000;
int v[N];
int n;

void print(){
    for(int i=0; i<n; ++i)
        out<<v[i]<<" ";
    out<<"\n";
}

int lowerThanPivot[N], greaterThanPivot[N];
int movePivot(int leftIndex, int rightIndex){ /// Consider "leftIndex" the pivot
    int lengthLower = 0, lengthGreater = 0;

    //int pivot_poz = leftIndex + (rand()*rand())%(rightIndex-leftIndex);
    ///int pivot_poz = rightIndex;
    int pivot_poz = leftIndex;
    int pivot = v[pivot_poz];

    for(int i=leftIndex; i <= rightIndex; ++i)
    {
        if(i == pivot_poz) continue;
        if(v[i] < pivot)
            lowerThanPivot[lengthLower++] = v[i];
        else
            greaterThanPivot[lengthGreater++] = v[i];
    }

    int pivotIndex = leftIndex + lengthLower;

    for(int i=leftIndex; i<pivotIndex; ++i)
        v[i] = lowerThanPivot[i - leftIndex];
    v[pivotIndex] = pivot;
    for(int i=pivotIndex + 1; i <= rightIndex; ++i)
        v[i] = greaterThanPivot[i - pivotIndex - 1];

    return pivotIndex;
}

void quickSort(int leftIndex, int rightIndex){
    if(leftIndex >= rightIndex)
        return;

    int pivotIndex = movePivot(leftIndex, rightIndex);

    //cout<<leftIndex<<", "<<rightIndex<<" | "<<pivotIndex<<"\n";
    //print();

    quickSort(leftIndex, pivotIndex-1);
    quickSort(pivotIndex+1, rightIndex);
}

int main()
{
    //srand(time(NULL));

    in>>n;
    for(int i=0; i<n; ++i)
        in>>v[i];

    //print();
    quickSort(0, n-1);
    print();

    return 0;
}