Pagini recente » Cod sursa (job #1051346) | Cod sursa (job #1285843) | Istoria paginii utilizator/ciuchilan_bianca | Cod sursa (job #1853150) | Cod sursa (job #2274069)
/**
* Worg
*/
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
FILE *fin = freopen("algsort.in", "r", stdin); FILE *fout = freopen("algsort.out", "w", stdout);
const int MAX_N = 5e5 + 5;
//-------- Data --------
int n;
int arr[MAX_N];
//-------- --------
void ReadInput() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
std::random_shuffle(arr, arr + n);
}
int PartitionArray(int begin, int end) {
int left = begin, right = end - 1, pivot = arr[begin + rand() % (end - begin)];
while (left < right) {
while (left < right && arr[left] < pivot) {
left++;
}
while (left < right && arr[right] >= pivot) {
right--;
}
if (left < right) {
std::swap(arr[left], arr[right]);
left++; right--;
}
}
int mid;
if (left == right) {
if (arr[left] < pivot) {
mid = left + 1;
} else {
mid = left;
}
} else {
mid = right + 1;
}
return mid;
}
bool AllEqual(int begin, int end) {
for (int i = begin; i < end; i++) {
if (arr[i] != arr[begin]) {
return false;
}
}
return true;
}
void QuickSort(int begin, int end) {
if (end - begin <= 1 || AllEqual(begin, end)) return;
int mid = PartitionArray(begin, end);
QuickSort(begin, mid);
QuickSort(mid, end);
}
void PrintOutput() {
for(int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
}
int main() {
ReadInput();
srand((unsigned)time(NULL));
QuickSort(0, n);
PrintOutput();
return 0;
}