Pagini recente » Borderou de evaluare (job #730908) | Borderou de evaluare (job #348570) | Borderou de evaluare (job #187400) | Cod sursa (job #1499000) | Cod sursa (job #2618186)
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cstdlib>
#include <ctime>
using namespace std;
const int NMAX = 500505;
int N, A[NMAX], copyA[NMAX];
void sortArray(int A[], int from, int to) {
if (to - from <= 0) {
return;
}
int pivot = A[from + rand() % (to - from + 1)];
// no constant space
int leftIdx = from, rightIdx = to, cntEqPivot = 0;
for (int idx = from; idx <= to; idx++) {
if (A[idx] < pivot) {
copyA[leftIdx++] = A[idx];
} else if (A[idx] > pivot) {
copyA[rightIdx--] = A[idx];
} else {
cntEqPivot++;
}
}
for (int idx = from; idx <= to; idx++) {
if (idx >= leftIdx && idx <= rightIdx) {
A[idx] = pivot;
} else {
A[idx] = copyA[idx];
}
}
sortArray(A, from, leftIdx - 1);
sortArray(A, rightIdx + 1, to);
}
int main() {
freopen("algsort.in", "r", stdin);
freopen("algsort.out", "w", stdout);
srand(time(0));
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N;
for (int idx = 1; idx <= N; idx++) {
cin >> A[idx];
}
sortArray(A, 1, N);
for (int idx = 1; idx <= N; idx++) {
if (idx > 1) {
cout << " ";
}
cout << A[idx];
}
cout << "\n";
return 0;
}