Pagini recente » Cod sursa (job #2561496) | Cod sursa (job #2374749) | Cod sursa (job #2259368) | Cod sursa (job #691063) | Cod sursa (job #1490596)
#pragma one
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <fstream>
#include <iomanip>
#include <cctype>
using namespace std;
const int maxSize = 1 << 20;
class pfstream {
private:
int cursor;
char buf[maxSize];
FILE *f;
inline void move() {
++ cursor;
if(cursor == maxSize) {
cursor = 0;
fread(buf, maxSize, 1, f);
}
}
inline int todig(char c) {
return c - '0';
}
public:
pfstream() {}
pfstream(const char *fname) {
f = fopen(fname, "r");
cursor = 0;
fread(buf, maxSize, 1, f);
}
inline pfstream &operator >> (int& N) {
char sign = '+';
while(!isdigit(buf[cursor])) {
sign = buf[cursor];
move();
}
N = 0;
while(isdigit(buf[cursor])) {
N = N * 10 + todig(buf[cursor]);
move();
}
if(sign == '-')
N = -N;
return *this;
}
inline pfstream &operator >> (float& N) {
char sign = '+';
while(!isdigit(buf[cursor])) {
sign = buf[cursor];
move();
}
N = 0;
while(isdigit(buf[cursor])) {
N = N * 10 + todig(buf[cursor]);
move();
}
if(buf[cursor] == '.') {
float p = 0.1;
move();
while(isdigit(buf[cursor])) {
N = N + p * todig(buf[cursor]);
p *= 0.1;
move();
}
}
if(sign == '-')
N = -N;
return *this;
}
};
void quickswap(int &a, int &b) {
a = a xor b;
b = a xor b;
a = a xor b;
}
const int MAX_N = 500000;
int v[MAX_N];
void quicksort(int *begin, int *end) {
if (begin < (end - 1)) {
int n = end - begin;
quickswap(*begin, begin[n >> 1]);
int *i = begin, *j = end - 1, d = 0;
while(i < j) {
if(*i > *j) {
quickswap(*i, *j);
d = 1 - d;
}
i += d;
j -= 1 - d;
}
quicksort(begin, i);
quicksort(i + 1, end);
}
}
void quicksorti(int st, int dr) {
if(st < dr) {
int m = (st + dr) >> 1;
if(st != m)
quickswap(v[st], v[m]);
int i = st, j = dr, d = 0;
while(i < j) {
if(v[i] > v[j])
quickswap(v[i], v[j]), d = 1 - d;
i += d, j -= 1 - d;
}
quicksorti(st, i - 1);
quicksorti(i + 1, dr);
}
}
int main() {
pfstream in("algsort.in");
freopen("algsort.out", "w", stdout);
int N;
in >> N;
for(register int i = 0; i < N; ++ i)
in >> v[i];
quicksorti(0, N - 1);
for(register int i = 0; i < N; ++ i)
printf("%d ", v[i]);
printf("\n");
return 0;
}