Pagini recente » Cod sursa (job #1248703) | Monitorul de evaluare | Cod sursa (job #159386) | Cod sursa (job #2976072) | Cod sursa (job #1260033)
#include <fstream>
#include <iostream>
#include <vector>
#include <ctime>
/**
* QUICKSORT
*/
void random_shuffle(std::vector<int> &v)
{
srand(time(NULL));
for (auto i = 0ul; i < v.size(); ++i) {
int r = rand() % (i + 1);
std::swap(v[i], v[r]);
}
}
void quicksort(std::vector<int> &v, int lo, int hi)
{
if (hi <= lo)
return;
int pivot = v[lo];
int lt = lo, gt = hi;
int i = lo;
while (i <= gt) {
if (v[i] < pivot)
std::swap(v[lt++], v[i++]);
else if (v[i] > pivot)
std::swap(v[i], v[gt--]);
else
++i;
}
quicksort(v, lo, lt - 1);
quicksort(v, lt + 1, hi);
}
void quicksort(std::vector<int> &v)
{
random_shuffle(v);
quicksort(v, 0, v.size() - 1);
}
/**
* HEAPSORT
*/
void sink(std::vector<int> &v, int k, int dim)
{
while (2*k < dim) {
auto son = 2 * k;
if (son + 1 < dim && v[son] < v[son + 1])
++son;
if (v[k] > v[son])
break;
std::swap(v[k], v[son]);
k = son;
}
}
void swim(std::vector<int> &v, int k)
{
while (k > 1 && v[k] > v[k/2]) {
std::swap(v[k], v[k/2]);
k /= 2;
}
}
void heapsort(std::vector<int> &v)
{
for (auto i = v.size() / 2; i >= 1; --i)
sink(v, i, v.size());
for (auto i = v.size() - 1; i >= 1; --i) {
std::swap(v[i], v[1]);
sink(v, 1, i);
}
}
void sort(std::vector<int> &v)
{
/* heapsort(v); */
quicksort(v);
}
int main()
{
std::ifstream fin("algsort.in");
std::ofstream fout("algsort.out");
int N;
fin >> N;
std::vector<int> v(N);
for (auto it = v.begin(); it != v.end(); ++it)
fin >> *it;
sort(v);
for (auto it = v.cbegin(); it != v.cend(); ++it)
fout << *it << " ";
return 0;
}