Insertion sort

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa
Insertion sort
classe Algoritmo de ordenação
estrutura de dados Array, Listas ligadas
complexidade pior caso O(n2)
complexidade caso médio O(n2)
complexidade melhor caso O(n)
complexidade de espaços pior caso O(n) total, O(1) auxiliar
estabilidade estável
Algoritmos
Exemplo de funcionamento do insertion sort em uma lista de inteiros aleatórios

Insertion sort, ou ordenação por inserção, é um simples algoritmo de ordenação, eficiente quando aplicado a um pequeno número de elementos. Em termos gerais, ele percorre um vetor de elementos da esquerda para a direita e à medida que avança vai deixando os elementos mais à esquerda ordenados. O algoritmo de inserção funciona da mesma maneira com que muitas pessoas ordenam cartas em um jogo de baralho como o pôquer.[1]

Índice

[editar] Características

  • Menor número de trocas e comparações entre os algoritmos de ordenação O(n) quando o vetor está ordenado.
  • Pior caso O(n²)

[editar] Implementações

[editar] Pseudocódigo

Segue uma versão simples do pseudocódigo do algoritmo, com vetores começando em zero:

FUNCAO INSERTION_SORT (A[], tamanho)

        VARIAVEIS
        var i, j, elemento;
        
        
        PARA j <- 0 ATÉ tamanho - 1 FAÇA
                elemento <- A[j];
                i <- j – 1;
                
                ENQUANTO ((i >= 0) E (A[i] > elemento)) FAÇA
                        A[i+1] <- A[i]
                        A[i] <- elemento
                        i <- i–1
                FIM_ENQUANTO
                
        FIM_PARA
        
FIM

[editar] xHarbour

Function SortInsertion( aList )
   Local nLoop1 := 0
   Local nLoop2 := 0
   Local nIndex := 0
   For nLoop1 := 1 To Len( aList )
       nLoop2 := nLoop1
       nIndex := aList[ nLoop1 ]
       While nLoop2 > 1 .And. aList[ nLoop2 - 1 ] > nIndex
          aList[ nLoop2 ] := aList[ nLoop2 - 1 ]
          nLoop2 --
       EndDo
       aList[ nLoop2 ] := nIndex
   Next
Return NIL

[editar] Java

        public static int[] insertionSort(int[] array) 
         {
                for (int i = 1; i < array.length; i++) 
                {
                        int a = array[i];
                        int j;
                        for (j = i - 1; j >= 0 && array[j] > a; j--)
                        {
                                array[j + 1] = array[j];
                                array[j] = a;
                        }
                }
                return array;
        }

[editar] Visual Basic

    Private Sub Ordenacao(Numeros() As Integer)
       Dim i As Long
       Dim j As Long
       Dim iMin As Long
       Dim iMax As Long
       Dim varSwap As Variant
       iMin = LBound(Numeros) + 1
       iMax = UBound(Numeros)
       For i = iMin To iMax
           varSwap = Numeros(i)
           For j = i To iMin Step -1
               If varSwap < Numeros(j - 1) Then Numeros(j) = Numeros(j - 1) Else Exit For
           Next j
          Numeros(j) = varSwap
       Next i
End Sub
'Code By Kalandar

[editar] C

void insertionSort(int v[], int tam)
{         
        int i, j, aux;
 
        for(i = 1; i < tam; i++){
 
                j = i;
 
                while(V[j] < V[j - 1]) {
 
                        aux = V[j];
                        V[j] = V[j - 1];
                        V[j - 1] = aux;
                        j--;   
 
                        if(j == 0)break;
                }         
        }
 
        return;
}

[editar] Pascal

procedure InsertionSort(var vet:array[1..20] of integer; n:integer; var NC, NT: integer);
var j,o,aux:integer; {variaveis auxiliares}
begin
  for j:=2 to n do
  begin
    o:=j-1;
    while (a[j]<a[o]) and (i>1) do
    begin
      inc(NT);
      aux:=a[j];
      a[j]:=a[o];
      a[o]:=aux;
      j:=i-1;
      o:=o-1;
      inc(NC);
    end;
  end;
end;

[editar] Python

def inssort(l):
    for i in range(1, len(l)):
        key = l[i]
        j = i
        while j > 0 and l[j - 1] > key:
            l[j] = l[j - 1]
            j -= 1
        l[j] = key

[editar] Haskell

import Data.List (insert)
 
insertsort :: Ord a => [a] -> [a]
insertsort = foldr insert []

[editar] C#

   static int[] ordernar(int[] A)
   { 
      int i, j, index;
      for (i = 1; i < A.Length; i++)
      {
          index = A[i];
          j = i;
          while ((j > 0) && (A[j - 1] > index))
          {
              A[j] = A[j - 1];
              j = j - 1;
          }
          A[j] = index;
      }
      return A;
   }


[editar] PHP

ini_set('max_execution_time','600');
 
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
 
 
for ($gera = 0; $gera <=20000; $gera++){
        $array[$gera] = rand(0, 10000);
}
 
$time_start = microtime_float();
for($i = 1; $i < count($array); $i++){
        $copiado = $array[$i];
        $j = $i;
                while (($j > 0 ) && ($copiado < $array[$j-1])){
                        $array[$j] = $array[$j-1];
                        $j--;
                }
                $array[$j] = $copiado;   
}
$time_end = microtime_float();
//Mostra o tempo que levou para ordenar
echo $time = $time_end - $time_start;
 
//Exibe a ordenação
print_r ($array);

[editar] C++

void Inserction(int n, int vetor[]){
   int j,i,key;
   for(j = 1; j < n; j++){
      key = vetor[j];
      i = j - 1;
      while(i >= 0 && vetor[i] > key){
         vetor[i + 1] = vetor[i];
         i = i - 1;
      }
      vetor[i + 1] = key;
   }
}

[editar] R

insertSort <- function(vec) {
  for(i in 1:length(vec)) {
    key <- vec[i]
    j <- i
    while(j > 1 && vec[j - 1] > key) {
      vec[j] <- vec[j - 1]
      j <- j - 1
    }
    vec[j] <- key
  }
  return(vec)
}

[editar] Simulador Online

Para um melhor entendimento, recomendo utilizarem o Simulador Online para visualizarem exemplos de ordenação de números aleatórios pelo Insertion Sort.

[editar] Ver também

Referências

  1. AZEREDO, Paulo A.. Métodos de Classificação de Dados e Análise de suas Complexidades. Rio de Janeiro: Campus, 1996. ISBN 85-352-0004-5

[editar] Referências

[editar] Ligações externas

Ferramentas pessoais
Espaços nominais
Variantes
Ações
Navegação
Colaboração
Imprimir/exportar
Ferramentas
Noutras línguas