Cod sursa(job #2951955)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 7 decembrie 2022 22:00:40
Problema Sortare prin comparare Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 5e5;

int N;
int v[NMAX];

void partition(int v[], int left, int right, int &a, int &b) {
	if(right - left <= 1) {
		if(v[right] < v[left]) {
			swap(v[right], v[left]);
		}
		a = left;
		b = right;	
	} else {
		int mid = left, pivot = v[right];

		while(mid <= right) {
			if(v[mid] < pivot) {
				swap(v[mid], v[left]);
				mid++;
				left++;
			} else if(v[mid] == pivot) {
				mid++;
			} else {
				swap(v[mid], v[right]);
				right--;
			}
		}
	}

	a = left - 1;
	b = right + 1;
}

void quickSort(int v[], int left = 0, int right = N - 1) {
	while(left <= right) {
		int a, b;
		partition(v, left, right, a, b);

		if(a - left + 1 < right - b + 1) {
			quickSort(v, left, a);
			left = b;
		} else {
			quickSort(v, b, right);
			right = a;
		}
	}
}

int main() {
	ios_base :: sync_with_stdio(false);

	fin >> N;

	for(int i = 0; i < N; i++) {
		fin >> v[i];
	}

	quickSort(v);

	for(int i = 0; i < N; i++) {
		fout << v[i] << " ";
	}

	fin.close();
	fout.close();
	return 0;
}