Sobre o método sort () integrado do Python

104

Qual algoritmo o sort()método embutido em Python está usando? É possível dar uma olhada no código desse método?

Johannes
fonte
10
Claro que é possível olhar o código do método - Python é um projeto de código aberto. O método provavelmente é implementado em C, portanto, você precisará saber um pouco sobre C para entendê-lo.
Chris Lutz,
A versão importa?
meder omuraliev
@melder: Não =) Eu só quero dar uma olhada em um algoritmo profissional: P @chris: como?
Johannes,
3
Baixe o código-fonte para o interpretador Python. Não sei onde eles implementam o sort()método ou qual é a formatação para o interpretador, mas tem que estar lá em algum lugar, e aposto que está implementado em C por questões de velocidade.
Chris Lutz,
Aqui está um exemplo de que está sendo usado
Hari Ganesan

Respostas:

119

Certo! O código está aqui , começando com função islte prosseguindo por QUITE um pouco ;-). Como o comentário de Chris sugere, é um código C. Você também vai querer ler este arquivo de texto para uma explicação textual, resultados, etc, etc.

Se você preferir ler código Java em vez de código C, pode olhar para a implementação de timsort de Joshua Bloch em e para Java (Joshua também é o cara que implementou, em 1997, o mergesort modificado que ainda é usado em Java, e pode-se esperar que Java o faça eventualmente, mude para sua porta recente do timsort).

Alguma explicação sobre a porta Java do timsort está aqui , o diff está aqui (com ponteiros para todos os arquivos necessários), o arquivo-chave está aqui - FWIW, embora eu seja um programador C melhor do que programador Java, neste caso eu acho O código Java de Joshua é mais legível em geral do que o código C de Tim ;-).

Alex Martelli
fonte
4
@Chris, "Browse Python sources" é um atalho em todas as barras de favoritos do meu navegador - aponta para svn.python.org/view/python/trunk ;-).
Alex Martelli,
Eu quero saber o que a função list_ass_item()faz. :)
Chris Lutz,
2
Executa a atribuição a um item da lista (assim como list_ass_slice executa a atribuição a uma parte da lista), nada a ver com classificação. Acho que a abreviatura de "atribuição" torna o nome engraçado ...
Alex Martelli
3
A versão atual do listsort.txtadiciona algumas notas que tratam de confusões comuns.
Tim Peters
9

Nas primeiras versões do python, a função sort implementou uma versão modificada do quicksort. No entanto, ele foi considerado instável e, a partir de 2.3, eles passaram a usar um algoritmo de fusão adaptável.

Silfverstrom
fonte
quicksort não é 'considerado instável' - pelas definições comumente usadas, quicksort é instável - isto é, a ordem original de dois objetos não é preservada, se eles forem iguais durante esta classificação. Ter um algoritmo de classificação instável significa que você tem que inventar todos os tipos de 'mágica' para classificar os dados de maneira sensata com vários critérios, em vez de simplesmente ser capaz de encadear chamadas de classificação - em timsort se você quiser classificar por DOB e depois nomear , você simplesmente classifica por nome primeiro e depois DOB. Você não pode fazer isso com quicksort
Tony Suffolk 66