Несравнительный алгоритм сортировки, такой как radix sort , может сортировать данные с 0 сравнениями! Они не такие универсальные c, как алгоритмы сравнительной сортировки, такие как сортировка слиянием или вставкой, но могут значительно улучшить время выполнения, если ваши данные соответствуют необходимым требованиям.
По существу, если вы знаете о распределении ваших данных вы можете сортировать быстрее, чем O (n log n) . Например, если вы сортируете n чисел и знаете, что они являются целыми числами между 1 и N , вы можете использовать счетную сортировку отсортировать их в O (n + N) . Вы можете итеративно добавлять элементы для O (1).
Применение этого к вашей проблеме ранжирования musi c более сложное (песни не являются целыми числами), но вы можете сделать вариацию bucket sort , где вы сначала складываете свои музыкальные файлы c, скажем, в 10% "ярусов": верхние 0-10%, 10-20%, 20-30%, ..., 90-100% ( то есть дно). Затем вы можете либо рекурсивно применить сортировку по сегментам (top 0-1%, 1-2%, et c.), Либо применить стандартные алгоритмы сортировки. В конце концов, вам нужно будет сделать стандартную сортировку сравнения. Этот подход, по сравнению только с использованием сортировки сравнения, уменьшит количество сравнений в log (n) / log (n / B) , где B - это число ковши. Для 100 сегментов и 10000 песен это сокращение в 2 раза.
Альтернативный, сохраняющий сравнение подход заключается в выполнении сортировки вставками (как для начальной сортировки, так и для последующих вставок) с модифицированным двоичным поиском . : вместо того, чтобы устанавливать начальные границы двоичного поиска на 0 и n , установите их в значения, основанные на вашей собственной интуиции того, где вы уверены, что это закончится, как 0 и n / 10 , если он определенно входит в ваши лучшие 10%. Чем более детально вы можете сделать это, тем меньше будет сравнений.
Предупреждение: как с сортировкой сегментов, так и с модифицированным двоичным поиском. Если вы не правы, вам потребуется выполнить дополнительные сравнения, чтобы исправить вашу ошибку.
И последнее слово: этот вопрос предполагает, что существует - это правильный рейтинг и , что его можно достичь с помощью сравнений. Если у вас есть круговые предпочтения, такие как a> b, b> c и c> a , a la rock-paper-scissors, тогда ранжирование не может быть построено. Алгоритмы все еще будут завершены, но полученный список будет непоследовательным.