Pagini recente » Autentificare | Bazar | Diferente pentru runda/fmi-no-stress-9-warmup intre reviziile 16 si 18 | omg_am_revenit | Cod sursa (job #1502783)
#include <fstream>
#include <queue>
#include <cstring>
#include <ctime>
#include <stdlib.h>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
const int NMAX = 500001;
int N;
int v[NMAX];
void read() {
fin >> N;
for(int i = 1 ; i <= N; ++i)
fin >> v[i];
}
void quicksort(int st, int dr) {
if(dr <= st) return;
int pivot = v[rand() % (dr - st) + st]; int left = st; int right = dr;
//swap(v[pivot], v[dr]);
do {
while(v[dr] > pivot) --dr;
while(v[st] < pivot) ++st;
if(st <= dr) {
swap(v[st], v[dr]);
st++;
dr--;
}
} while(st <= dr);
//daca pivotul nu interschimb cu pivotul, si nu ma ocup sa potioneaz pivotul unde trebuie insemna ca el nu se afla pe pozitia finala
//asa ca nu pot sorta pe bucati de genul (st, pivot) si (pivot + 1, dr) ci mai degraba st, pivot, dr
if(dr > left)
quicksort(left, dr);
if(st < right)
quicksort(st, right);
}
int main() {
read();
srand(time(NULL));
quicksort(1, N);
for(int i = 1; i <= N; i++)
fout << v[i] << " ";
return 0;
}