О Windows из первых рук: Эволюция сортировки

История развития алгоритмов сортировки в проводнике Windows длинная и чуть запутанная.

Раймонд Чен

В ранней версии проводника Windows алгоритм сортировки был очень прост — имена просто сортировались функцией lstrcmpi. Выполнялось сравнение с учетом региональных особенностей и без учета регистра символов. Представьте себе, что даже с этой функцией сравнения были сложности. Например, у нее было особое отношение к знакам переноса и апострофам.

В результате при сортировке проводник в Windows 95 размещал файл с именем «file139» перед файлом по имени «file20». Это совершенно логично с компьютерной точки зрения, но совершенно интуитивно не понятно для нормального человека, что еще раз доказывает, что программисты не относятся к нормальным людям.

В Windows XP алгоритм сортировки был обновлен, чтобы больше отвечать ожиданиям живых людей. В нем цифры в именах файлов интерпретировались как числа, а не последовательность символов. Хотя это упростило работу многим людям, были случаи, когда это изменение приводило к замешательству.

Один из постоянно возникающих примеров — имена с шестнадцатеричными числами. В соответствии с новым, ориентированным на числа алгоритмом сортировки, проводник Windows полагал, что файл по имени «1040A» должен размещаться рядом с файлом «1040», но никак не с файлом «103F2». Если по какой-то причине вам приходится просматривать папки, наполненные файлами, имена которых содержат шестнадцатеричные числа, можете включить политику «Turn off numerical sorting in Windows Explorer» (Отключить числовое упорядочивание проводника Windows). Она изменяет порядок на тот, что был в версиях Windows, предшествующих Windows XP, а именно на сортировку по символам.

Точки и пробелы

В Windows Vista в алгоритм сравнения были внесены небольшие корректировки, из-за того что точки служат двум целям. С одной стороны, они обыкновенные символы, а с другой, — они отделяют имя файла от расширения. В результате файл с именем «File 1.txt» очевидным для компьютера образом размещается после файла «File.txt», потому что точка не выдержала сравнения с пробелом, который оказался главнее.

В Windows Vista разработчики Microsoft добавили в алгоритм сортировки новое правило, которое предусматривает, что при сортировке точки приоритетнее пробелов. Если оно вам не нравится, можете отключить его, задав параметр NoDotBreakInLogicalCompare, но только в Windows Vista. Этот параметр не работает в Windows 7.

Есть еще один странный случай, в котором может оказаться предпочтительнее посимвольная сортировка: если имена ваших файлов содержат числа с плавающей десятичной точкой. Основанный на числах алгоритм сортировки разместит «1.5» перед «1.25». Это правильно, если это порядковые номера нумерованных параграфов в крупном документе, например договоре. «Глава 1, раздел 5» предшествуют элементу «Глава 1, раздел 25».

С другой стороны, если «1.5» и «1.25» — габариты детали станка в сантиметрах, тогда разумно ожидать, что «1.25» будет размещаться перед «1.5». Так как проводнику Windows не хватает контекста, чтобы узнать, чем является та или иная последовательность цифр, — номером параграфа в иерархической нумерации или числом с плавающей десятичной точкой, ему нужно ваша помощь.

В Windows 7 в алгоритм сортировки было внесено более тонкое изменение. Один клиент заметил, что если у двух файлов примерно следующие имена:file1.txt и file2.txt, то при сортировке по типу, они располагаются именно в таком порядке, что вполне ожидаемо.

Но если щелкнуть заголовок столбца Type (Тип) второй раз, чтобы изменить порядок сортировки на обратный, в более ранних версиях Windows файл file1.txt все равно будет располагаться до file2.txt. Однако в Windows 7 это приведет к тому, что файл file2.txt разместиться перед file1.txt. Клиент был удивлен таким изменением поведения, считая его «нелогичным».

Столбец Type «понимает», что у многих элементов может быть одинаковый тип, поэтому выполняет разбиение по имени элемента. Помимо обеспечения большей логичности сортировки по типу, это означает, что при смене порядка сортировки на обратный, порядок элементов в каждом типе также изменится на обратный. Это вполне ожидаемое поведение для многих пользователей, потому что они ожидают, что при переключении столбца сортировка элементов сменится на обратную.

Поэтому следующий раз выполняя сортировку, помните, что хотя сортировка и кажется простой и прямолинейной, у нее есть много нюансов.

Raymond Chen’s

Раймонд Чен (Raymond Chen) — его веб-сайт и одноименная книга «Old New Thing», вышедшая в издательстве Addison-Wesley в 2007 году, рассказывает об истории Windows, программировании с использованием интерфейса Win32 и гигантских металлических цыплятах.