Мы храним в этой очереди…
• самый большой элемент
• самый большой из следующих за ним
• самый большой из следующих за вторым
и т.д.
Как только большой уходит, «самый большой из следующих» автоматом занимает его место.
Я же написал: банальная кольцевая очередь ёмкостью w−1 (обычно, чтобы различать полную и пустую очередь, делают один холостой элемент, т.е. буфер длины w).
А если приоритетная — то две проблемы. 1) Что в ней будет приоритетом? 2) В сложность не вписываемся.
Алгоритм тяжёлый, дайте ещё подумать.
Первый алгоритм не решает задачу — например, убывающая последовательность 5, 4, 3, 2, 1 даст пересчёт на каждой итерации, O(n²).
Второй вообще заметает сложность под ковёр, т.к. сложность зависит от того, как действует список «лучших», но, в любом случае, не n².
Скорее всего, ты устроил гонку между VCL и потоком. Я-то напишу вечером, когда вернусь, но почти уверен, что когда будешь восстанавливать прикладную функциональность, гонка снова начнётся.
Вопрос: что ты передаёшь внутрь потока и что из него возвращаешь? Имена файлов? Набор TJpeg?