Pagini recente » Cod sursa (job #745060) | Cod sursa (job #2655591) | Cod sursa (job #1792218) | Cod sursa (job #1649443) | Cod sursa (job #2458998)
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>
constexpr auto SMALL_SORT_THRESHOLD = 500;
void small_sort(std::vector<uint32_t>& v, uint32_t fst, uint32_t lst)
{
// Make a heap, then use selection sort
std::make_heap(&v[fst], &v[lst + 1], std::greater<uint32_t>());
for (size_t i = fst + 2; i <= lst; ++i) {
uint32_t bubble = v[i];
uint32_t right = i;
uint32_t left = right;
while (v[--left] > bubble)
{
v[right--] = v[left];
}
v[right] = bubble;
}
}
void qsort(std::vector<uint32_t>& v, uint32_t left, uint32_t right) {
if (right <= left)
return;
if ((right - left + 1) <= SMALL_SORT_THRESHOLD) {
small_sort(v, left, right);
return;
}
const auto mid = (left+right)/2;
const auto rnd = left + rand() % (right - left);
std::swap(v[mid], v[rnd]);
const auto pivot = v[mid];
auto i1 = left;
auto i2 = right;
while (i1 < i2) {
while((v[i1] < pivot)) ++i1;
while((v[i2] > pivot)) --i2;
std::swap(v[i1], v[i2]);
++i1;
--i2;
}
qsort(v, left, i2);
qsort(v, i2 + 1, right);
}
int main()
{
std::srand(std::time(nullptr));
std::ifstream fin("algsort.in");
std::ofstream fout("algsort.out");
std::vector<uint32_t> v;
uint32_t n;
fin >> n;
v.reserve(n);
for (uint32_t i = 0; i < n; ++i) {
uint32_t x;
fin >> x;
v.push_back(x);
}
qsort(v, 0, v.size() - 1);
for (const auto x : v) {
fout << x << " ";
}
return 0;
}