C# - Algoritmos de ordenação de dados : Inserção
Os algoritmos de ordenação de dados podem parecer um assunto acadêmico mas na verdade estão presentes a todo momento em nossas vidas e nos sistemas que desenvolvemos. Muitas vezes as linguagens atuais trazem recursos que permitem que com um único comando seja feita a ordenação de uma estrutura de dados e muitas vezes não nos percebemos da importância que esta por trás disso. |
Meu objetivo neste artigo é apresentar os principais algoritmos de ordenação para que possamos estudá-los e compreendê-los melhor.
Pretendo apresentar os seguintes algoritmos em artigos :
E vou iniciar pelo algoritmo de inserção mas antes de iniciar a parte prática vamos a um pouco de teoria...
O algoritmo de ordenação por inserção
Comecei por este por ser o mais simples e intuitivo; ele é baseado em ações que praticamos no dia dia para realizar ordenações simples com um pequeno número de elementos.
O algoritmo de ordenação por inserção é muito eficiente quando aplicado a um pequeno número de elementos e funciona assim:
- Percorre-se um vetor de elementos da esquerda para a direita e à medida que se avança se vai deixando os elementos mais à esquerda ordenados.(Inseridos no final do vetor);
Este método é exatamente o que usamos quando temos algumas cartas de baralho para ordenar.
Uma implementação simples deste algoritmo necessita de duas estruturas de listas :
Este algoritmo é mais eficiente que o Bubble Sort e que o algoritmo Selection Sort e pode ser usado com eficácia para ordenações de até 1000 itens.
Vejamos a seguir sua implementação na linguagem C# e em VB .NET:
Abra o Visual Basic 2010 Express Edition e crie um novo projeto do tipo Windows Application com o nome InsercaoAlgoritmo;
No formulário padrão form1.vb inclua a partir da ToolBox um controle ListBox e um botão de comando aceitando os nomes padrão;
Arranje os controles conforme o leiaute da figura abaixo:
Vamos agora definir o código irá aplicar o algoritmo de inserção para ordenar uma sequência de números em um array.
No início do formulário form1.vb vamos declarar a definição do array de 20 elementos:
'define um array de 20 elementosNo evento Load do formulário vamos atribuir valores ao array e exibi-los no controle ListBox:
Private
Sub
Form1_Load(ByVal
sender As
System.Object,
ByVal
e As
System.EventArgs)
Handles
MyBase.Load
arr.SetValue(8, 0) 'primeiroarr.SetValue(9, 1) 'segundoarr.SetValue(2, 2) 'terceiroarr.SetValue(4, 3) arr.SetValue(17, 4) arr.SetValue(5, 5) arr.SetValue(7, 6) arr.SetValue(3, 7) arr.SetValue(11, 8) arr.SetValue(27, 9) arr.SetValue(18, 10) arr.SetValue(1, 11) arr.SetValue(21, 12) arr.SetValue(40, 13) arr.SetValue(10, 14) arr.SetValue(15, 15) arr.SetValue(6, 16) arr.SetValue(13, 17) arr.SetValue(19, 18) arr.SetValue(14, 19)
Me.Text = "Algoritmo de ordenação por inserção" 'exibe os valores do array no listbox For i As Integer = 0 To arr.Length - 1lista.Items.Insert(i, arr.GetValue(i))
Next End Sub |
No evento Click do botão Ordenar vamos incluir o código que faz a chamada a rotina de inserção e exibe os elementos ordenados:
Private
Sub
Button1_Click(ByVal
sender As
System.Object,
ByVal
e As
System.EventArgs)
Handles
Button1.Click
ordenacaoPorInsercao() 'limpa o listbox lista.Items.Clear()
lista.Items.Insert(x, arr.GetValue(x))
Next
|
Agora vejamos o código principal que faz a ordenação usando o algoritmo de inserção:
Private
Sub
ordenacaoPorInsercao()
Dim k As Integer = 0
'obtem um valor do array e guarda em temp temp = CInt(arr.GetValue(j))
k = j - 1 'Executa enquando k for maior e igual a zero e tambem o valor do índice k do array for maior que temp 'temp é o valor obtido do segundo elemento então ele esta comparando o anterior com o próximo While k >= 0 AndAlso CInt(arr.GetValue(k)) > temp 'efetua a inserção do valor arr.SetValue(arr.GetValue(k), k + 1) k = k - 1 End While 'atribui o valor no array arr.SetValue(temp, k + 1)
Next |
Uma versão para esta rotina na Linguagem C# pode ser vista no código a seguir:
static
int[]
ordenar(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; } |
Executando o projeto Visual Basic iremos obter o resultado conforme mostrado abaixo:
Existe muita informação com artigos e vídeos na web sobre este importante assunto que são os algoritmos de ordenação.
Simples , simples assim...
Pegue o projeto VB .NET completo aqui: InsercaoAlgoritmo.zip
Pegue o projeto C# completo aqui: AlgoritmoInsercao.zip
Aguarde o próximo artigo sobre algoritmos de ordenação.
Eu sei é apenas Visual Basic e C# , mas eu gosto.
Referências:
Link do vídeo acima no Youtube: http://www.youtube.com/watch?v=t8g-iYGHpEA
Outro Link para o algoritmo HeapSort no Youtube: http://www.youtube.com/watch?v=iXAjiDQbPSw&feature=related