Cod sursa(job #1502783)

Utilizator TeodorCotetCotet Teodor TeodorCotet Data 14 octombrie 2015 23:54:57
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#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;
}