Cod sursa(job #2087888)

Utilizator Andreiii500Andrei Puiu Andreiii500 Data 14 decembrie 2017 14:53:13
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
/// QuickSort
#include <iostream>
#include <fstream>
#include <cstdlib>
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 - leftIndex) / 2 ;
    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()
{ 
    in>>n;
    for(int i=0; i<n; ++i)
        in>>v[i];
 
    //print();
    quickSort(0, n-1);
    print();
 
    return 0;
}