Pagini recente » Cod sursa (job #2220635) | Cod sursa (job #2913780) | Cod sursa (job #897630) | Cod sursa (job #2253891) | Cod sursa (job #2381567)
#include <bits/stdc++.h>
#include <unordered_map>
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
int choosePiv(vector<int> &v, int left, int right)
{
int mid = left + (right - left) / 2;
if ((v[left] <= v[mid] <= v[right]) || (v[left] >= v[mid] >= v[right]))
return mid;
if ((v[left] <= v[right] <= v[mid]) || (v[left] >= v[right] >= v[mid]))
return right;
if ((v[mid] <= v[left] <= v[right]) || (v[mid] >= v[left] >= v[right]))
return left;
}
int pivSwap(vector<int> &v, int left, int right)
{
if (left >= right)
return -1;
int pivPos = choosePiv(v, left, right);
swap(v[right], v[pivPos]);
int i = left, j = right - 1;
while (i <= j)
{
int pivVal = v[right];
if (v[i] > pivVal && v[j] < pivVal)
swap(v[i], v[j]);
else
{
if (v[i] <= pivVal)
++i;
if (v[j] >= pivVal)
--j;
}
}
// put pivot in its place
swap(v[i], v[right]);
return i;
}
void qsort(vector<int> &v, int left, int right)
{
int pivIndex = pivSwap(v, left, right);
if(pivIndex != -1)
qsort(v, left, pivIndex - 1),
qsort(v, pivIndex + 1, right);
}
int main()
{
int n, x;
vector<int> v;
f >> n;
while (n--)
f >> x,
v.push_back(x);
qsort(v, 0, v.size() - 1);
for (auto x : v)
g << x << ' ';
return 0;
}