Algoritmos de ordenação - Parte 2: o insertsort

Python
Enviado por thotypous em Sáb, 08/07/2006 - 22:05.Python

Continuando a nossa série sobre algoritmos de ordenação, apresentamos neste artigo o funcionamento do insertsort e um exemplo de implementação em Python.

O insertsort

Um dos métodos mais naturais que uma pessoa pode pensar para ordenar esse vetor é o insertsort. Geralmente fazemos insertsort mesmo sem perceber no dia-a-dia, quase que instintivamente. :)

Imagine que você tivesse um bolo de cartas na sua mão e quisesse ordená-las. Você provavelmente vai pensar em ir procurando a menor carta desse bolo desordenado de cartas e ir separando em um outro bolo ordenado de cartas, até que o bolo desordenado esvaziasse.

O insertsort funciona exatamente assim, mas, para uma melhor performance, ele coloca o bolo de cartas ordenado na frente do bolo de cartas desordenado, assim ele aproveita o mesmo bolo (no caso, o vetor).

Uma parte do vetor, que começa no início dele, vai ficando ordenada conforme você executa o algoritmo, e o tamanho dessa parte do vetor cresce cada vez mais, enquanto a parte desordenada diminui, até acabar.

Para facilitar a implementação, usaremos uma variante do insertsort que funciona da seguinte maneira: procuramos o menor elemento da parte desordenada do vetor e o trocamos com o primeiro elemento dessa parte desordenada. Após esse procedimento, esse elemento passará a integrar a parte ordenada.

Tomemos novamente o nosso vetor de exemplo: [4,5,2,1,3,7,5].

  1.     ordenado      desordenado
  2.   _____|_____     _____|_____
  3.  /           \   /           \
  4. [                4,5,2,1,3,7,5]
  5. [1,                5,2,4,3,7,5]
  6. [1,2,                5,4,3,7,5]
  7. [1,2,3,                4,5,7,5]
  8. [1,2,3,4,                5,7,5]
  9. [1,2,3,4,5,                7,5]
  10. [1,2,3,4,5,5,                7]
  11. [1,2,3,4,5,5,5,7              ]
  12.  

No exemplo a seguir, i indica o índice da primeira posição da parte desordenada do vetor, e j é um índice auxiliar para achar o menor elemento da parte desordenada.

  1. def isort(a):
  2.     for i in range(len(a)):
  3.         min = a[i]
  4.         k = i
  5.         for j in range(i + 1, len(a)):
  6.             if min > a[j]:
  7.                 min = a[j]
  8.                 k = j
  9.         t = a[k]
  10.         a[k] = a[i]
  11.         a[i] = t
  12.  
  13. a = [4,5,2,1,3,7,5]
  14. print repr(a)
  15. isort(a)
  16. print repr(a)
  17.  

Não perca na segunda-feira o próximo artigo da série, sobre o mergesort!