Алгоритм сортировки, сохраняющий «равные» элементы в одном и том же порядке, считается стабильным. Таким образом, нестабильный означает: у вас есть несколько одинаковых элементов, и когда вы сортируете общий список/массив, на выходе этой сортировки эти равные элементы (потенциально) отображаются в другой порядок.
Предположим, например, что у вас есть класс Person, и реализовано равенство, чтобы смотреть только на фамилию и игнорировать имя.
Теперь предположим, что у вас есть два объекта Person, представляющие «John Doe» и «Jane Doe». Они находятся в вашем несортированном списке именно в таком порядке.
Стабильный означает: вы всегда заканчиваете тем, что «Джон Доу» появляется перед «Джейн Доу». С нестабильной сортировкой у вас нет такой гарантии.
Другими словами: вам нужно создать класс, который имеет как минимум два атрибута. Затем вам нужно определить compareTo()
, чтобы полагаться только на одно из двух свойств.
Затем вы создаете примерный список объектов этого класса, а затем достаточно долго экспериментируете, пока не найдете пример, в котором отсортированный список показывает, что одинаковые объекты изменили порядок.
Другими словами: создайте список (p1, p2, p3, p4, ...), отсортируйте его, а затем посмотрите на результат, который, возможно, говорит ... p4, p3 ... хотя p4 и p3 считаются " равный".
И наконец: на самом деле это был бы очень хороший вариант использования некоторой среды тестирования на основе свойств, такой как Быстрая проверка. Используя такую структуру, вам потребуется:
- создайте «генератор», который может создавать «случайные» объекты некоторого класса, по которому вы позже сортируете (где вы искажаете генератор, чтобы гарантировать, что вы получите из него кучу «равных» объектов)
- затем попросите фреймворк проверить базовое «утверждение», что порядок «равных» объектов до и после сортировки не должен меняться.
И пусть фреймворк сделает свое волшебство...
person
GhostCat
schedule
14.06.2019