Pagini recente » Cod sursa (job #1622832) | Cod sursa (job #1645679) | Cod sursa (job #2578745) | Cod sursa (job #1680924) | Cod sursa (job #2692045)
#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, j = dr;
while (true)
{
while (v[i] < piv)i++;
while (v[j] > piv)j--;
if (i >= j)
return j;
int t = v[i];
v[i] = v[j];
v[j] = t;
i++, j--;
}
}
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();
}