Сортировка в C++
Помогите разобраться с кодом. Программа считывает из входного файла с первой строки количество элементов массива, а со второй строки входного файла сами элементы. Все считывается в вектор, а затем все элементы сортируются и выводятся в выходной файл. Мне не понятны в этой программе некоторые вещи:
- Я не понимаю, как именно здесь работает < algorithm >, зачем его подключили?
- Зачем здесь using std::string?
- Почему здесь в auto iter записывается результат сложения первого элемента вектора с его количеством, деленным на 2?
- Векторы v1 и v2 создаются, чтобы занести в каждый из них две половинки массива(одна половинка в v1, а другая в v2)? vector v1(vec.begin(), iter); - это же значит, что в векторе v1 находятся все числа, находящиеся в диапазоне от начального элемента массива до значения переменной iter и с v2 все аналогично?
- Функция mergeSort2 вызывается дважды внутри самой себя, чтобы отсортировать две половинки массива?
- Мы же очищаем вектор(vec.clear()), чтобы сработала сначала mergeSort2(v1), а затем mergeSort2(v2)?
- Я правильно понимаю, что в последней строке функции mergeSort2 объединяются два диапазона(первый из v1, а второй из v2)в один диапазон, а back_inserter(vec) записывает его в вектор vec с конца?
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
using std::cout; using std::endl;
using std::string; using std::vector;
template<typename T>
void mergeSort2(vector<T>& vec) {
if (vec.size() <= 1)
return;
auto iter = vec.begin() + vec.size() / 2;
vector<T> v1(vec.begin(), iter);
vector<T> v2(iter, vec.end());
mergeSort2(v1);
mergeSort2(v2);
vec.clear();
std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(vec));
}
int main()
{
std::ifstream in("sort.in");
std::ofstream out("sort.out");
int n;
in >> n;
vector<int> vec1(n);
for (int i = 0; i < n; i++)
in >> vec1[i];
mergeSort2(vec1);
for (int i = 0; i < n; i++)
out << vec1[i] << " ";
return 0;
}
Ответы (1 шт):
Автор решения: Alexey Vesker
→ Ссылка
В вашем примере представлена реализация алгоритма сортировки слиянием Отвечая на ваши вопросы:
<algorithm>- нужен чтобы вызватьstd::merge;using std::string- можно удалить, ни на что не повлияет;- почитайте про алгоритм сортировки слиянием по ссылке выше - поймете;
- да, верно;
- да, две очередные половинки, это называется рекурсия;
- нет, мы очищаем его, чтобы положить туда результат работы
std::merge; - почти правильно, только не "с конца", а в конец. Элементы массивов
v1иv2будут добавляться в конец массиваvec;