Pagini recente » Cod sursa (job #1248841) | Cod sursa (job #3290246) | Cod sursa (job #103733) | Cod sursa (job #1053414) | Cod sursa (job #2439189)
// https://www.infoarena.ro/problema/algsort
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
const char input_file[] = "algsort.in";
const char output_file[] = "algsort.out";
void Read(vector<int>* numbers) {
ifstream is(input_file);
int size;
is >> size;
*numbers = vector<int>(size, 0);
for (int i = 0; i < size; ++i) {
is >> (*numbers)[i];
}
is.close();
}
void Write(const vector<int>& numbers) {
ofstream os(output_file);
for_each(numbers.begin(), numbers.end(), [&os](const int number){ os << number << " ";});
os.close();
}
void Replace(const int left, vector<int>& new_numbers, vector<int>* old_numbers) {
for (size_t i = 0; i < new_numbers.size(); ++i) {
(*old_numbers)[i + left] = new_numbers[i];
}
}
void MergeSort(const int left, const int right, vector<int>* numbers) {
const int size = right - left + 1;
if (size == 1) {
return;
}
const int md = size / 2;
MergeSort(left, left + md - 1, numbers);
MergeSort(left + md, right, numbers);
vector<int> new_numbers = vector<int>();
int i = 0;
int j = md;
while (new_numbers.size() != static_cast<size_t>(size)) {
if (i == md) {
new_numbers.push_back((*numbers)[left + j]);
++j;
continue;
}
if (j == size) {
new_numbers.push_back((*numbers)[left + i]);
++i;
continue;
}
if ((*numbers)[left + i] > (*numbers)[left + j]) {
new_numbers.push_back((*numbers)[left + j]);
++j;
continue;
}
new_numbers.push_back((*numbers)[left + i]);
++i;
}
// cout << "\n2. left: " << left << " right " << right << "\n";
// for (int i = 0; i < size; ++i) {
// cout << new_numbers[i] << " ";
// }
Replace(left, new_numbers, numbers);
}
void QuickSort(const int left, const int right, vector<int>* numbers) {
// cout << "\n1. left: " << left << " right " << right << "\n";
// const int size = right - left + 1;
// if (size <= 1) {
// return;
// }
const int pivot = left + (right - left) / 2;
int i = left, j = right;
while (i <= j) {
while ((*numbers)[i] < (*numbers)[pivot]) {
++i;
}
while ((*numbers)[j] > (*numbers)[pivot]) {
--j;
}
if (i <= j) {
if (i != j) {
swap((*numbers)[i], (*numbers)[j]);
}
++i;
--j;
}
}
if (left < j) {
QuickSort(left, j, numbers);
}
if (right > i) {
QuickSort(i, right, numbers);
}
}
int main() {
vector<int> numbers;
Read(&numbers);
QuickSort(0, numbers.size() - 1, &numbers);
Write(numbers);
return 0;
}