Про побудований Python методом sort ()


104

Який алгоритм використовується вбудованим sort()методом в Python? Чи можливо подивитися код цього методу?


10
Звичайно, можна подивитися код методу - Python - проект з відкритим кодом. Однак метод, ймовірно, реалізований в C, тому вам доведеться трохи знати про C, щоб мати сенс цього.
Кріс Лутц

Чи має значення версія?
meder omuraliev

@melder: Ні =) Я просто хочу переглянути про алгоритм: P @chris: як?
Йоганнес

3
Завантажте вихідний код до інтерпретатора Python. Я не знаю, де вони реалізують sort()метод, або що таке форматування інтерпретатора, але воно повинно бути десь там, і я думаю, що він реалізований в C для проблем щодо швидкості.
Кріс Лутц

Ось приклад його використання
Харі Ганесан

Відповіді:


119

Звичайно! Код тут , починаючи з функції isltта продовжуючи ДОВІТЬ ;-). Як свідчить коментар Кріса, це код C. Ви також хочете прочитати цей текстовий файл для текстового пояснення, результатів тощо тощо.

Якщо ви віддаєте перевагу читанню Java-коду, ніж коду C, ви можете подивитися на реалізацію тимчасового моменту Джошуа Блоха і для Java (Джошуа - також хлопець, який впровадив у 1997 році модифікований об'єднаний елемент, який все ще використовується в Java, і можна сподіватися, що Java буде врешті-решт перейти до свого недавнього порту темсорту).

Деякі пояснення Java-портів timsort є тут , diff є тут (із вказівниками на всі необхідні файли), ключовий файл тут - FWIW, в той час як я кращий програміст C, ніж програміст Java, в цьому випадку я знаходжу Код Java Джошуа в цілому легше читається, ніж код С Тіма ;-).


4
@Chris, "Переглянути джерела Python" - це ярлик у всіх панелях закладок моїх браузерів - він вказує на svn.python.org/view/python/trunk ;-).
Алекс Мартеллі

Я хочу знати, що функція list_ass_item()виконує. :)
Кріс Лутц

2
Виконує присвоєння елементу списку (так само, як list_ass_slice виконує присвоєння фрагменту списку), нічого спільного з сортуванням. Я здогадуюсь, абревіатура "завдання" робить ім'я смішним ...
Алекс Мартеллі

3
Поточна версія з listsort.txtдодає деякі примітки , що адреса загального замішання.
Тім Пітерс


9

У ранніх версіях python функція сортування реалізувала модифіковану версію quicksort. Однак це було визнано нестабільним і з 2.3 перейшли на використання адаптивного алгоритму злиття.


quicksort не 'вважається нестабільним' - за загальновживаними визначеннями, quicksort є нестабільним - тобто первісне впорядкування двох об'єктів не зберігається, якщо вони рівні під час цього сорту. Наявність нестабільного алгоритму сортування означає, що вам доведеться придумувати всілякі "магії", щоб розумно сортувати дані за кількома критеріями, а не просто мати можливість впорядкувати дзвінки сортування - в timsort, якщо ви хочете сортувати за DOB, а потім іменем , ви просто спочатку сортуйте за назвою, а потім DOB. Ви не можете цього зробити з quicksort
Tony Suffolk 66,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.