Вы хотите быть осторожным здесь.Вы решили использовать алгоритм, который постепенно создает отсортированную структуру данных, чтобы (я так понимаю) вы могли отображать индикатор выполнения.Однако при этом вы , возможно, выбрали метод сортировки, который значительно медленнее, чем оптимальная сортировка.(Оба вида будут O(NlogN)
, но это больше производительности, чем поведение big-O ...)
Если вы обеспокоены тем, что это может быть проблемой, сравните время для сортировки типичной коллекции, используя TreeMap
и Collections.sort
.Последний работает, копируя входную коллекцию в массив, сортируя массив и затем копируя его обратно.(Это лучше всего работает, если входная коллекция представляет собой ArrayList. Если вам не нужен результат как изменяемая коллекция, вы можете избежать окончательного копирования обратно, используя вместо этого Collection.toArray
, Arrays.sort
и Arrays.asList
.)
Альтернативной идеей может быть использование объекта Comparator, который отслеживает количество вызовов, которые он вызывал, и использовать его для отслеживания прогресса сортировки.Вы можете использовать тот факт, что компаратор, как правило, будет вызываться примерно N*log(N)
раз, хотя вам может потребоваться откалибровать его по фактическому используемому алгоритму 1 .
Кстати,подсчет звонков в компаратор даст вам лучшее представление о прогрессе, чем при подсчете вставок.Вы не получите скорость прогресса, которая будет замедляться по мере приближения к завершению сортировки.
(У вас будут разные потоки, считывающие и записывающие счетчик, поэтому вам нужно учитывать синхронизацию. Объявление счетчика как volatile
будет работать за счет дополнительного трафика памяти. Вы также можете просто проигнорироватьпроблема, если вы рады, что индикатор выполнения иногда отображает устаревшие значения ... в зависимости от вашей платформы и т. д.)
1 - с этим связана проблема.Существуют некоторые алгоритмы, в которых количество сравнений может существенно различаться в зависимости от исходного порядка сортируемых данных.Для такого алгоритма нет способа откалибровать счетчик, который будет работать в «не средних» случаях.