Реализации алгоритмов/Сортировка/Слиянием: различия между версиями
Содержимое удалено Содержимое добавлено
Asymreply (обсуждение | вклад) Нет описания правки Метка: визуальный редактор отключён |
|||
Строка 4:
/**
* @brief Сортировка элементов от
* @param[in/out] buf - сортируемый массив
* @param[in]
* @param[in]
*
* В результате сортируются все элементы массива buf от
*/
template<typename Type>
void MergeSort(vector<Type>& buf, size_t
{
//! Условие выхода из рекурсии
if(
size_t
//! Рекурсивная сортировка полученных массивов
MergeSort(buf,
MergeSort(buf,
merge(buf,
}
Строка 28:
* @brief Слияние элементов.
* @param[in/out] buf - массив
* @param[in]
* @param[in]
* @param[in]
*
* Массив buf содержит два отсортированных подмассива:
* - [
* - [
* В результате получаем отсортированный массив, полученный из двух подмассивов,
* который сохраняется в buf[
*/
template<typename Type>
static void merge(vector<Type>& buf, size_t
{
if (
if (
swap(buf[
return;
}
vector<Type> tmp(&buf[
for (size_t i =
if (j >
buf[i] = tmp[k++];
} else if(k >
buf[i] = tmp[j++];
} else {
Строка 70:
* m1 - Первый массив
* m2 - Второй массив
*
*
* Возвращает объединённый массив
*/
template <class T>
T* merge(T *m1, T* m2, int
{
T* ret = new T[
int n = 0;
// Сливаем массивы, пока один не закончится
while (
if (*m1 < *m2) {
ret[n] = *m1;
m1++;
--
} else {
ret[n] = *m2;
++m2;
--
}
++n;
}
// Если закончился первый массив
if (
for (int i = 0; i <
ret[n++] = *m2++;
}
} else { // Если закончился второй массив
for (int i = 0; i <
ret[n++] = *m1++;
}
Строка 109:
void mergeSort(T * mas, int len)
{
int n = 1,
T * mas1;
while (n < len) {
while (
if (
ost = (
mas1 = merge(mas +
for (int i = 0; i < n + ost; ++i)
mas[
delete [] mas1;
}
n *= 2;
Строка 165:
template <typename Item>
void MergeSort(Item a[], int
{
int
// Условие выхода из рекурсии
if(
// Рекурсивная сортировка полученных массивов
MergeSort(a,
MergeSort(a,
Merge(a,
}
|