Classificação por inserção: algoritmo com C, C++, Java, Python Exemplos

O que é classificação por inserção?

A classificação por inserção é um dos algoritmos de classificação por comparação usados ​​para classificar elementos, iterando um elemento por vez e colocando o elemento em sua posição correta.

Cada elemento é inserido sequencialmente em uma lista já ordenada. O tamanho da lista já ordenada inicialmente é um. O algoritmo de classificação por inserção garante que os primeiros k elementos sejam classificados após a k-ésima iteração.

Características do algoritmo de classificação por inserção

O Algoritmo para Classificação por Inserção possui as seguintes características importantes:

  • É uma técnica de classificação estável, portanto não altera a ordem relativa de elementos iguais.
  • É eficiente para conjuntos de dados menores, mas não eficaz para listas maiores.
  • A classificação por inserção é adaptativa, o que reduz seu número total de etapas se for parcialmente classificada. Ordem é fornecido como entrada para torná-lo eficiente.

Como Inserir Operatrabalho?

No algoritmo Insertion Sort, a operação de inserção é usada para classificar elementos não classificados. Ajuda inserir um novo elemento em uma lista já classificada.

Pseudocódigo da operação de inserção:

Considere uma lista A de N elementos.

A[N-1] is the element to be inserted in the sorted sublist A[0..N-2].
For i = N-1 to 1:
if A[i] < A[i-1], then swap A[i] and A[i-1]
else Stop   

inserção Operatrabalho de ção

No exemplo acima, um novo elemento 6 deve ser inserido em uma lista já ordenada.

Passo 1) Comparado com o elemento adjacente esquerdo de A[5], 9 > 6, trocamos a posição de 9 e 6. Agora o elemento 6 é movido para A[4].

Passo 2) Agora, comparamos A[4] e A[3] e descobrimos que A[3] > A[4], trocamos novamente as posições de 6 e 8.

Passo 3) Agora compare A[3] e A[2], pois A[2] > A[3] troca a posição de 7 e 6.

Passo 4) Comparamos A[1] e A[2], e como A[1] < A[2], ou seja, o elemento adjacente à esquerda não é mais maior. Agora concluímos que 6 está inserido corretamente e paramos o algoritmo aqui.

Como funciona a classificação por inserção

A operação de inserção discutida acima é a espinha dorsal da classificação por inserção. O procedimento de inserção é executado em cada elemento e, no final, obtemos a lista ordenada.

A classificação por inserção funciona

A figura do exemplo acima demonstra o funcionamento da classificação por inserção na estrutura de dados. Inicialmente, apenas um elemento existe na sublista classificada, ou seja, 4. Após inserir A [1], ou seja, 3, o tamanho da sublista classificada aumenta para 2.

C++ Programa para classificação por inserção

#include <iostream>
using namespace std;

int main(){
    //unsorted list
    int unsorted[] = {9,8,7,6,5,4,3,3,2,1};
    
    //size of list
    int size_unsorted = sizeof(unsorted) / sizeof(unsorted[0]); 

    //printing unsorted list
    cout << "\nUnsorted: ";
    for(int i = 0 ; i < size_unsorted ; i++){
        cout << unsorted[i] << " ";
    } 

    int current_element,temp;

    for(int i = 1; i < size_unsorted; i++){        
        current_element = unsorted[i];
        for(int j = i-1; j >= 0 && unsorted[j] > current_element; j--){
            //swapping if current element is lesser
            temp = unsorted[j+1];
            unsorted[j+1] = unsorted[j];
            unsorted[j] = temp;
        }
    }

    //printing sorted list
    cout << "\nSorted: ";
    for(int i = 0 ; i < size_unsorted ; i++){
        cout << unsorted[i] << " ";
    } 

    return 0;
}

Saída:

Unsorted: 9 8 7 6 5 4 3 3 2 1 
Sorted: 1 2 3 3 4 5 6 7 8 9

Código C para classificação por inserção

#include <stdio.h>
int main() {
    //unsorted list
    int unsorted[] = {9,8,7,6,5,4,3,3,2,1};

    //size of list
    int size_unsorted = sizeof(unsorted) / sizeof(unsorted[0]);

    //printing unsorted list
    printf("\nUnsorted: ");
    for(int i = 0 ; i < size_unsorted ; i++){
        printf("%d ", unsorted[i]);
    }

    int current_element, temp;

    for(int i = 1; i < size_unsorted; i++){
        current_element = unsorted[i];
        for(int j = i-1; j >= 0 && unsorted[j] > current_element; j--){
            //swapping if current element is lesser
            temp = unsorted[j+1];
            unsorted[j+1] = unsorted[j];
            unsorted[j] = temp;
        }
    }

    //printing sorted list
    printf("\nSorted: ");
    for(int i = 0 ; i < size_unsorted ; i++){
        printf("%d ", unsorted[i]);
    }

    return 0;
}

Saída:

Output:
Unsorted: 9 8 7 6 5 4 3 3 2 1 
Sorted: 1 2 3 3 4 5 6 7 8 9

Python Programa para classificação por inserção

#unsorted list
unsorted = [9,8,7,6,5,4,3,3,2,1]

#size of list
size_unsorted = len(unsorted)

#printing unsorted list
print("\nUnsorted: ", end="")
for i in range(size_unsorted):
    print(unsorted[i], end=" ")

for i in range(1, size_unsorted):
    current_element = unsorted[i]
    j = i - 1
    while j >= 0 and unsorted[j] > current_element:
        #swapping if current element is lesser
        unsorted[j+1], unsorted[j] = unsorted[j], unsorted[j+1]
        j -= 1

#printing sorted list
print("\nSorted: ", end="")
for i in range(size_unsorted):
    print(unsorted[i], end=" ")

Saída:

Unsorted: 9 8 7 6 5 4 3 3 2 1 
Sorted: 1 2 3 3 4 5 6 7 8 9

Propriedades da classificação por inserção

Aqui estão propriedades importantes da classificação por inserção:

  • Online: A classificação por inserção pode classificar os elementos à medida que os recebe. Ou seja, se já classificamos uma lista de elementos e acrescentamos mais alguns elementos às listas, não precisamos executar todo o procedimento de classificação novamente. Em vez disso, precisamos iterar apenas nos elementos recém-adicionados.
  • No lugar: A complexidade de espaço do algoritmo de classificação por inserção é constante e não requer espaço extra. Este algoritmo classifica os elementos no lugar.
  • Estável: Na classificação por inserção, não trocamos os elementos se seus valores forem iguais. Por exemplo, dois elementos, x e y, são iguais e x aparece antes de y em listas não classificadas; então, na lista classificada, x aparecerá antes de y. Isso torna a classificação por inserção estável.
  • Adaptável: A algoritmo de classificação é adaptativo se levar menos tempo se os elementos de entrada ou subconjunto de elementos já estiverem classificados. Como discutimos acima, o melhor tempo de execução da classificação por inserção é O(N) e o pior tempo de execução é O(N^2). A classificação por inserção é um dos algoritmos de classificação adaptativa.

Complexidade da classificação de inserção

Complexidade do Espaço

A ordenação por inserção não requer espaço extra para ordenar os elementos, a complexidade do espaço é constante, ou seja, O(1).

Complexidade de tempo

Como a classificação por inserção itera cada elemento simultaneamente, são necessárias N-1 passagens para classificar N elementos. Para cada passagem, ele pode fazer zero trocas se os elementos já estiverem ordenados, ou trocar se os elementos estiverem organizados em ordem decrescente.

  • Para a passagem 1, os swaps mínimos exigidos são zero e os swaps máximos exigidos são 1.
  • Para a passagem 2, os swaps mínimos exigidos são zero e os swaps máximos exigidos são 2.
  • Para a passagem N, a troca mínima exigida é zero e as trocas máximas exigidas são N.
  • A troca mínima é zero, então a melhor complexidade de tempo é O(N) para iterar N passagens.
  • O total máximo de swaps é (1+2+3+4+..+N) i. N(N+1)/2, a pior complexidade de tempo é O(N^2).

Aqui está a importante complexidade de tempo da classificação por inserção:

  • Complexidade do pior caso: O (n2): Classificar um array em ordem decrescente quando ele está em ordem crescente é o pior cenário.
  • Melhor complexidade do caso: O(n): Melhor Case Complexity ocorre quando o array já está ordenado, o loop externo é executado por n número de vezes enquanto o loop interno não é executado. Há apenas n número de comparações. Então, neste caso, a complexidade é linear.
  • Complexidade média do caso: O (n2): Acontece quando os elementos de um array ocorrem em ordem confusa, que não é crescente nem decrescente.

Resumo

  • A classificação por inserção é um método de algoritmo de classificação baseado na comparação.
  • É uma técnica de classificação estável, portanto não altera a ordem relativa de elementos iguais.
  • Em cada elemento, a operação de inserção é usada para inserir o elemento na sublista classificada.
  • A classificação por inserção é um algoritmo de classificação local.
  • A pior e média complexidade de tempo da ordenação por inserção é quadrática, ou seja, O(N^2).
  • A classificação por inserção não requer nenhum espaço auxiliar.