Pagini recente » Cod sursa (job #2695823) | Cod sursa (job #2347498) | Cod sursa (job #21188) | Cod sursa (job #1564771) | Cod sursa (job #1452407)
#include <iostream>
#include <fstream>
#include <ctime>
#define NMAX 500000
const char IN[] = "algsort.in", OUT[] = "algsort.out";
using namespace std;
int N;
int v[NMAX];
inline void swap(int poz1, int poz2) {
if (&v[poz1] != &v[poz2]) {
v[poz1] = v[poz1] ^ v[poz2];
v[poz2] = v[poz2] ^ v[poz1];
v[poz1] = v[poz1] ^ v[poz2];
}
}
inline void readData() {
freopen(IN, "r", stdin);
scanf("%d", &N);
for (int i = 0; i < N; ++i) {
scanf(" %d", &v[i]);
}
fclose(stdin);
}
inline void partition(int low, int high, int pivot,
int &lesser, int &higher) {
while (low <= high) {
while (v[low] < pivot) ++low;
while (v[high] > pivot) --high;
if (low <= high) swap(low++, high--);
}
lesser = low; //limita superioara elementelor <pivot
higher = high; //limita inferioara elementelor >pivot
}
void qsort(int low, int high) {
if (low == high - 1) (v[low] > v[high]) ? (swap(high, low)) : void();
if (low == high) return;
if (low < high) {
int lesser, higher;
int m = low + rand() % (high - low);
partition(low, high, v[m], lesser, higher);
if(low < higher) qsort(low, higher);
if (high > lesser) qsort(lesser, high);
}
}
int main() {
readData();
srand(time(NULL));
qsort(0, N - 1);
freopen(OUT, "w", stdout);
for (int i = 0; i < N; ++i)
printf("%d ", v[i]);
printf("\n");
fclose(stdout);
return 0;
}