Pagini recente » Cod sursa (job #2212278) | Cod sursa (job #237046) | Cod sursa (job #83514) | Cod sursa (job #1681545) | Cod sursa (job #2692040)
#include <iostream>
#include <fstream>
int v[500000], n;
int mediana(int st, int dr) {
int mid = (st + dr) / 2;
if ((v[st] > v[mid]) ^ (v[st] > v[dr]))
{
int t = v[mid];
v[mid] = v[st];
v[st] = t;
}
else
if ((v[dr] > v[st]) ^ (v[dr] > v[mid]))
{
int t = v[mid];
v[mid] = v[dr];
v[dr] = t;
}
if (v[st] > v[dr])
{
int t = v[st];
v[st] = v[dr];
v[dr] = t;
}
return v[mid];
}
void print()
{
std::cout << '\n';
for (int i = 0; i < n; ++i)
std::cout << v[i] << ' ';
std::cout << '\n';
}
int pivot(int st, int dr)
{
int piv = mediana(st, dr);
int i = st - 1, j = dr + 1;
while (true)
{
do {
i++;
} while (v[i] < piv);
do {
j--;
} while (v[j] > piv);
if (i >= j)
return j;
int t = v[i];
v[i] = v[j];
v[j] = t;
}
}
void quicksort(int st, int dr) {
if (st < dr) {
int p = pivot(st, dr);
quicksort(st, p);
quicksort(p + 1, dr);
}
}
int main() {
std::ifstream f("algsort.in");
f >> n;
for (int i = 0; i < n; ++i)
f >> v[i];
f.close();
quicksort(0, n - 1);
std::ofstream g("algsort.out");
for (int i = 0; i < n; ++i)
g << v[i] << ' ';
g.close();
}