Теория: Общая информация изложена здесь
Практика: informatics.mccme.ru
Визуализатор: rain.ifmo.ru [Java]
Реализация:
- void merge (vector<int> &mas, int l, int m, int r)
- {
- vector<int> buffer(r - l + 1); // результирующий массив
- int pos1 = l; // начальная позициция первого подмассива
- int pos2 = m+1; // начальная позиция второго подмассива
- int posB = 0; // начальная позиция результирующего массива
-
- while (pos1<=m && pos2<=r)
- {
- if (mas[pos1]<mas[pos2])
- buffer[posB++] = mas[pos1++];
- else
- buffer[posB++] = mas[pos2++];
- }
- while (pos1<=m)
- buffer[posB++] = mas[pos1++];
- while (pos2<=r)
- buffer[posB++] = mas[pos2++];
-
- copy(buffer.begin(),buffer.end(),mas.begin() + l);
- buffer.clear();
- }
- void merge_sort(vector<int> &mas, int l, int r)
- {
- if (l == r) // спустились до 1 элемента
- return;
- int m = (l + r)>>1;
- merge_sort(mas,l,m);
- merge_sort(mas,m+1,r);
-
- merge(mas,l,m,r);
- }
* This source code was highlighted with Source Code Highlighter.
Хотя сортировка слиянием и имеет сложность O(N*logN), но константа у нее может быть велика. В первую очередь это связано с созданием временного массива(buffer) в функции merge. Для того, чтобы просто отсортировать массив больше подойдет алгоритм Быстрой сортировки. Но тем не менее важно знать и уметь использовать механизм слияния двух отсортированных массивов.
Как дополнение к применению. Техника Merge Sort может быть применена для подсчёта количества инверсий в перестановках, нахождения результата операций для множеств после предварительной сортировки.
ОтветитьУдалить