Pagini recente » Istoria paginii runda/usu2/clasament | Cod sursa (job #2924192) | Cod sursa (job #981674) | Cod sursa (job #606329) | Cod sursa (job #1139045)
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
class Sorter {
public:
Sorter(vector<int> V) : S(V) {
srand(time(0));
qsort(0, V.size() - 1);
}
int operator[](int i) { return S[i]; }
private:
vector<int> S;
void qsort(int a, int b) {
// cerr << "SORTING " << a << " " << b << endl;
if (a >= b) return;
// for (int i=a; i<=b; ++i) cerr << S[i] << " "; cerr << endl;
int pivot = rand() % (b-a+1) + a;
int X = S[pivot];
// cerr << "PIVOT " << pivot << " " << X << endl;
for (int l=a, h=b; l<h; ) {
if (S[l] > X) {
swap(S[l], S[h]);
--h;
} else {
++l;
}
}
for (pivot=a; pivot < b; ++pivot) {
if (S[pivot] == X) {
if (S[pivot] > S[pivot+1]) {
swap(S[pivot], S[pivot+1]);
} else {
break;
}
}
}
// for (int i=a; i<=b; ++i) cerr << S[i] << " "; cerr << endl;
qsort(a, pivot-1);
qsort(pivot + 1, b);
}
};
int main() {
ifstream in("algsort.in");
ofstream out("algsort.out");
int N;
in >> N;
vector<int> V(N);
for (int i=0; i<N; ++i) {
in >> V[i];
}
Sorter S(V);
for (int i=0; i<N; ++i) out << S[i] << " ";
out << "\n";
return 0;
}