Não era bem esse tipo de resposta que eu queria. Na realidade,
quando nenhum elemento da lista é maior que o que está a seguir, é porque a lista já está ordenada. Por isso é que no bubble sort temos "enquanto tiverem havido trocas".
Se queres que eu te diga, acho que aquele n não faz muito sentido como parâmetro da função. A ideia do bubble sort é:
1. Fazer uma passagem pelo array todo
2. Fazer uma passagem pelo array todo excepto o último elemento (porque na passagem anterior o último elemento estará com certeza na posição correcta)
3. Fazer uma passagem pelo array todo excepto os dois últimos elementos (mesma razão)
4. (...) (fazer passagens até não existirem trocas de elementos)
A mim parece-me que o correcto seria:
Código:
def bubbleSort(L):
n = len(L)
houve_troca = True
while houve_troca:
houve_troca = False
for i in range(n-1):
if L[i] > L[i+1]:
L[i],L[i+1] = L[i+1],L[i]
houve_troca = True
n = n - 1
A razão pela qual subtrais 1 ao valor de n tem a ver com o facto de teres que aceder ao elemento na posição i + 1 . Se fosse range(n), ias chegar a uma altura em que fazias L[n-1] > L[n], o que não é permitido, porque os índices só vão de 0 a n-1.
Depende do que entenderes por "melhor". Se tivesses a certeza que só ias trabalhar com 3 elementos, os ifs encadeados são provavelmente o método mais eficiente. Os algoritmos de ordenamento são mais genéricos (ou seja, funcionam para qualquer número de elementos). Fora esses dois métodos, não estou a ver mais nenhum que permite determinar qual dos números é o menor/maior.