Чтобы доказать, что алгоритм сортировки нестабилен, требуется только найти один сбой.Доказательство того, что алгоритм сортировки стабилен, будет более сложным.Один из способов проверить наличие ошибок - использовать массив целых чисел и разделить их на две части: верхние 8 битов - это псевдослучайное значение, а младшие 24 бита равны индексу целого числа (от 0 до count-1).Затем выполните сортировку, используя только 8 старших бит для сравнения, например, в C:
if((b[j]&0xff000000) < (b[i]&0xff000000)) ...
После завершения сортировки убедитесь, что массив в порядке, используя все 32 бита.
Используя этот метод, я смог подтвердить, что этот вариант сортировки слиянием нестабилен.
Очевидно, причина, по которой это называется "быстрой" сортировкой слиянием, заключается в том, что нет проверки концазапустить при выполнении слияния.Левый цикл копируется в aux [] в прямом порядке от lo до mid, а правый цикл копируется в aux [] в обратном порядке от hi до mid + 1.Затем объединение начинается с обоих концов (lo и hi) и продолжается к середине (mid и mid + 1), левый ход, используя i вперед от lo до середины, правый ход назад, используя j от высокого до среднего + 1.Поскольку нет проверки для достижения конца цикла, i может быть увеличен выше среднего (потенциальная проблема стабильности), или j может быть уменьшен ниже середины + 1 (не стабильность)выпуск).Стабильность нарушается в случае, когда i увеличивается выше середины, и aux [mid + 1] == aux [mid + 2], два самых высоких элемента из исходного правого прогона.В этом случае элементы копируются в обратном порядке.
Хотя книга назвала это быстрой сортировкой слиянием, было бы быстрее избежать копирования данных в aux и вместо этого изменить направление слияния на основе уровнярекурсии.Сверху вниз, это можно сделать с помощью однотипной копии и замены ссылок на массивы в рекурсивных вызовах, например, в этом примере вики:
https://en.wikipedia.org/wiki/Merge_sort#Top-down_implementation
Первоначальной копии можно избежать, используяпара взаимно рекурсивных функций, одна из которых заканчивается результатом в a [], а другая - результатом b [].
Немного быстрее - сортировка слиянием снизу вверх, так как она пропускает все рекурсивное разбиение и сохранение индексов в стеке.В этом случае направление слияния основывается на проходе слияния.Чтобы сохранить количество проходов четным, можно заранее проверить счетчик нечетных проходов, и пары элементов поменялись местами перед началом первого прохода сортировки слиянием снизу вверх.