Я думаю, даже если бы вы написали свой собственный вид, вам бы пришлось провести много тщательных измерений, если вы хотите, чтобы индикатор прогресса был точным.Если вам нужен только приблизительный индикатор прогресса, вы можете использовать в качестве метрики некоторую метрику, например «среднее расстояние между сравниваемыми элементами» или «количество сравнений по сравнению со средним ожидаемым числом для быстрой сортировки», и реализовать идею сравнения, о которой вы уже упоминали.
И да, я предполагаю, что вы не полный идиот и не планируете обновлять индикатор прогресса при каждом сравнении.Если бы вы сделали это, вы бы потратили гораздо больше времени на отображение прогресса, чем на сортировку.
В качестве примера вы, как правило, ожидаете около n log2 n
операций для быстрой сортировки.Анализ количества сравнений является более подробным и может быть более точным, чем этот общий показатель, но для целей этого примера, давайте просто предположим.Таким образом, вы можете посчитать сравнения и сообщить number_of_comparisons / (n log2 n)
как оценку прогресса.
Поскольку это всего лишь средний показатель, я бы провел несколько экспериментов и посмотрел бы, насколько далеко ваша оценка, и добавлю некоторые коэффициенты помадки, чтобыпривести его в соответствие со средним ожидаемым случаем.Вы также могли бы иметь индикатор выполнения, который указывал на неопределенность, имея вид «Это то, где я думаю, что я сделаю».индикатор и некоторое пространство после индикатора.
Даже если вы использовали свою собственную сортировку и нашли более, казалось бы, более точную меру, индикатор выполнения все равно не будет плавно обновляться, и эффект будет аналогичным.Единственный способ точно определить, сколько времени займет ваш сортировка, - это использовать несколько более медленную, но действительно предсказуемую сортировку, и в этом случае вы можете предсказать, сколько времени это займет из числа элементов, или использовать действительно быстрыйсортировка с менее предсказуемым поведением в определенных случаях, и в этом случае нет реального способа получить совершенно точный индикатор выполнения.
Предсказуемость подзадач и предсказуемость общего числа сравнений тесно связаны.Поэтому я действительно не думаю, что подзадачи являются лучшим показателем, чем общее число сравнений.
Если вы хотите использовать собственную сортировку, а ваша цель - предсказуемость, выберите heapsort .Это все еще O(n log2 n)
сортировка, и она близка к минимальной сортировке сравнения (или я так помню из чтения Кнута).Кроме того, требуется очень предсказуемое количество времени для выполнения независимо от набора данных, который он подал.Это один из медленных сортов O(n log2 n)
, но все же.
Как уже упоминал один из ваших комментаторов, вы, возможно, решаете проблему, которой на самом деле не существует.Сначала запустите несколько экспериментов.Проблема - забавная интеллектуальная проблема независимо от ее полезности все же.: -)