Pagini recente » Cod sursa (job #419005) | Cod sursa (job #1864665) | Cod sursa (job #1745338) | Cod sursa (job #2821010) | Cod sursa (job #3211126)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
/// STL
std::ifstream fin("algsort.in");
std::ofstream fout("algsort.out");
void MergeSort(std::vector<int>& v) {
if (v.size() > 1) {
size_t rightMost = (v.size() >> 1);
std::vector<int> left(v.begin(), v.begin() + rightMost);
std::vector<int> right(v.begin() + rightMost, v.end ());
MergeSort(left), MergeSort(right);
std::merge(left.begin(), left.end(), right.begin(), right.end(), v.begin());
}
}
/// No STL
const int nMax = 5e5 + 1;
int v[nMax], temporary[nMax];
void Merge(int start1, int end1, int end2) {
int i = start1, j = end1 + 1, Size = 0;
while (i <= end1 && j <= end2) {
if (v[i] < v[j])
Size += 1, temporary[Size] = v[i], i += 1;
else if (v[i] > v[j])
Size += 1, temporary[Size] = v[j], j += 1;
else
Size += 1, temporary[Size] = v[j], j += 1;
}
while (i <= end1)
Size += 1, temporary[Size] = v[i], i += 1;
while (j <= end2)
Size += 1, temporary[Size] = v[j], j += 1;
for (int i = 1, ind = start1; i <= Size; i += 1, ind += 1)
v[ind] = temporary[i];
}
void MergeSortNoSTL(int left, int right) {
if (left < right) {
int middle = (left + right) >> 1;
MergeSortNoSTL(left, middle), MergeSortNoSTL(middle + 1, right);
Merge(left, middle, right);
}
}
int main() {
// int n; fin >> n;
// std::vector<int> v(n);
// for (int i = 0; i < n; i += 1)
// fin >> v[i];
//
// MergeSort(v);
// for (auto elem : v)
// fout << elem << ' ';
int n; fin >> n;
if (n >= nMax) {
fout << "Cam multe numere...";
return 0;
}
for (int i = 1; i <= n; i += 1)
fin >> v[i];
MergeSortNoSTL(1, n);
for (int i = 1; i <= n; i += 1)
fout << v[i] << ' ';
return 0;
}