Умм .. 1000 записей ??Вы все еще в пределах доминирующего полиномиального коэффициента. Если у меня есть выборка-сортировка: 15 * n ^ 2 (читает) + 5 * n ^ 2 (перестановки) вставка-сортировка: 5 * n ^ 2 (читает) + 15* n ^ 2 (swaps) сортировка слиянием: 200 * n * log (n) (чтение) 1000 * n * log (n) (слияние)
Вы будете в гонкеА пока ... Кстати, в 2 раза быстрее в сортировке НИЧЕГО.Попробуйте в 100 раз медленнее.Вот где чувствуются реальные различия.Попробуйте "не закончить в моей жизни" алгоритмы (есть известные регулярные выражения, которые требуют столько времени, чтобы соответствовать простым строкам).
Так что попробуйте записи 1M или 1G и дайте нам знать, если вы все-таки слились-сортировка идет не очень хорошо.
При этом ..
Есть много вещей, которые делают сортировку слиянием дорогой.Прежде всего, никто никогда не запускает быструю сортировку или сортировку слиянием на мелкомасштабных структурах данных. Где у вас есть if (len <= 1), люди обычно ставят: if (len <= 16): (используйте встроенную вставку-сортировку) else: сортировка слиянием На КАЖДОМ уровне распространения. </p>
Поскольку сортировка с вставкой имеет меньшую стоимость коэффициента при меньших размерах n.Обратите внимание, что 50% вашей работы выполняется на этой последней миле.
Далее вы без необходимости запускаете array1.pop (0) вместо поддержки счетчиков индекса.Если вам повезет, python эффективно управляет смещениями начала массива, но при прочих равных условиях вы изменяете входные параметры
Кроме того, вы знаете размер целевого массива во время слияния, зачем копировать- и дважды удваивать merged_array. Предварительно назначать размер целевого массива в начале функции. Это сэкономит как минимум дюжину «клонов» на уровень объединения.
В общем, сортировка слиянием использует 2-кратный размер оперативной памяти. Ваш алгоритм, вероятно, использует 20-кратный размер из-за всех временных буферов слияния (возможно, python может освободить структуры перед рекурсией).Это нарушает элегантность, но, как правило, лучшие алгоритмы сортировки слиянием делают немедленное выделение буфера слияния равным размеру исходного массива, и вы выполняете сложную адресную арифметику (или индекс-массива + span-length), чтобы просто продолжать слияние данных-структуры туда и обратно.Это не будет так просто, как простая рекурсивная проблема, подобная этой, но она несколько близка.
В C-сортировке когерентность кэша - ваш главный враг.Вам нужны горячие структуры данных, чтобы максимизировать кэш.Распределяя временные временные буферы (даже если диспетчер памяти возвращает указатели на горячую память), вы рискуете сделать медленные вызовы DRAM (предварительно заполнив строки кэша для данных, которые вы собираетесь перезаписать).Это одно из преимуществ вставки-сортировки, выбора-сортировки и быстрой сортировки по сравнению с сортировкой слиянием (при реализации, как указано выше)
Кстати, что-то вроде быстрой сортировки - это и естественно элегантный код, и естественно эффективный-код, и не тратит впустую память (Google это в Википедии - у них есть реализация javascript, из которой можно основать свой код).Трудно выжать последнюю унцию производительности из быстрой сортировки (особенно в языках сценариев, поэтому они обычно используют C-api для выполнения этой части), и у вас наихудший случай O (n ^ 2),Вы можете попытаться проявить смекалку, выполнив комбинацию «пузырьковая сортировка / быстрая сортировка», чтобы уменьшить наихудший случай.
Счастливое кодирование.