Pagini recente » Cod sursa (job #1711287) | Cod sursa (job #53853) | Cod sursa (job #2779658) | Cod sursa (job #941437) | Cod sursa (job #2083584)
/// 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 = 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);
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;
}