Pagini recente » Cod sursa (job #1756598) | Cod sursa (job #140968) | Cod sursa (job #2258392) | Cod sursa (job #101095) | Cod sursa (job #2458993)
#include <fstream>
#include <vector>
#include <algorithm>
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 pivot = v[left];
auto i1 = left;
auto i2 = right;
while (i1 < i2) {
while((v[i1] < pivot) && (i1 < i2)) ++i1;
while((v[i2] >= pivot) && (i1 < i2)) --i2;
std::swap(v[i1], v[i2]);
}
qsort(v, left, i1);
qsort(v, i1 + 1, right);
}
int main()
{
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;
}