Короче говоря : потому что обычно построение этого списка выполняется только один раз, тогда как поиск (и обновление) выполняется несколько раз.
Для построения отсортированного списка действительно требуется O (n log n) . Смысл использования бинарного поиска заключается в том, что после сортировки коллекции мы можем выполнить несколько запросов в этом списке, каждый с O (log n) .
Кроме того, если вы, например, используете двоичное дерево поиска, вы можете выполнить вставку и удаление элементов в O (log n) , поэтому обновление коллекции может быть дешево (если вы используете для этого эффективную структуру данных).
Например, в базе данных часто используются индексы для быстрого поиска. Обычно количество операций чтения велико по сравнению с количеством обновлений. Обновление одного элемента требует O (log n) , поэтому создание индекса для существующих данных действительно дорого, но это не очень распространено по сравнению с поиском и обновлением B-дерева структура данных [wiki] .