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
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 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.


