C# - Algoritmos de ordenação - III
Hoje vamos continuar apresentando os algoritmos de ordenação usando a linguagem C#. |
Continuando o artigo anterior vamos tratar agora do algoritmo de ordenação Selection Sort.
Ordenação com Selection Sort
O algoritmo de ordenação Selection Sort usa o método de ordenação por seleção percorrendo o array em busca do menor valor e movendo para a posição correta precedido pelo elemento de menor valor, ou seja, ele passa sempre o menor valor do array para a primeira posição, depois o segundo menor valor para a segunda posição e assim por diante.
O número de operações necessárias usadas no Selecion Sort pode ser obtido pela fórmula: n * ( n-1) / 2
Para análise assintótica, podemos ignorar os valores constantes, e o que importa é o valor n² / 2 , pois conforme a lista cresce, este valor vai aumentar quadraticamente.
Obs: Análise Assintótica é uma forma de julgarmos se o nosso algoritmo é eficiente, independente dos “recursos que o cercam” (como velocidade de processamento, quantidade de memória, latência de rede, etc). (wikibooks)
Assim o algoritmo Selection sort possui tempo de execução O(n²).
A seguir temos uma implementação da ordenação com Selecion Sort no C#:
using System;
namespace Selection_Sort
{
class Program
{
static void Main(string[] args)
{
int[] numeros = { 230, 45, 345, 14, 324, 90, 76, 34, 67 , 3 };
Console.WriteLine("######## Ordenação com Selecion Sort ########\n");
Console.WriteLine("Array original\n");
foreach (int numero in numeros)
Console.Write($"{numero} ");
Console.WriteLine("\n\nOrdenando o array usando Selection Short\n");
int[] arrayOrdenado = IntArraySelectionSort(numeros);
Console.WriteLine("Array Ordenado\n");
foreach (int numero in arrayOrdenado)
Console.Write($"{numero} ");
Console.ReadLine();
}
public static int[] IntArraySelectionSort(int[] data)
{
int i;
int N = data.Length;
for (i = 0; i < N - 1; i++)
{
int k = IntArrayMin(data, i);
if (i != k)
TrocarValores(data, i, k);
}
return data;
}
public static int IntArrayMin(int[] data, int start)
{
int minPos = start;
for (int pos = start + 1; pos < data.Length; pos++)
{
if (data[pos] < data[minPos])
minPos = pos;
}
return minPos;
}
public static int[] TrocarValores(int[] arrayDados, int m, int n)
{
int temp;
temp = arrayDados[m];
arrayDados[m] = arrayDados[n];
arrayDados[n] = temp;
return arrayDados;
}
}
}
|
Vamos entender o código:
A ordenação é feita pelo método IntArraySelectionSort() que recebe um array de inteiros como parâmetro.
- Um laço externo visita cada item no array para descobrir se este valor é o mínimo de todos os elementos depois dele. Se não for o mínimo ele será trocado por qualquer item do resto do array que seja o mínimo.
- Foi usado o método IntArrayMin() para encontrar a posição do valor mínimo no array. Este método possui o parâmetro start que indica onde desejamos iniciar a pesquisa.
Lembrando que no C# o índice do primeiro elemento é 0. Assim em um array de 10 elementos o laço inicia com zero e vai até 9.
A ordenação por seleção faz a maior parte de seu trabalho por meio de comparações, que são sempre as mesmas, independentemente de como os dados são ordenados.
No selection sort, não temos pior e melhor caso, pois ele sempre executará a mesma quantidade de vezes dado o tamanho da lista, não importa que itens venham na entrada.
Uma implementação alternativa sem usar métodos auxiliares pode ser vista a seguir:
public static int[] SelectionSort(int[] array)
{
int min, aux;
for (int i = 0; i< array.Length - 1; i++)
{
min = i;
for (int j = i + 1; j< array.Length; j++)
{
if (array[j] < array[min])
min = j;
}
if (min != i)
{
aux = array[min];
array[min] = array[i];
array[i] = aux;
}
}
return array;
}
|
Executando o projeto teremos o resultado abaixo :
Pegue o projeto completo aqui: Algoritmos_Ordenacao_2.zip
Na próxima parte do artigo veremos o algoritmo de ordenação insertion sort.
"17 Quando
o vi (Jesus), caí aos seus pés como morto. Então ele colocou sua mão
direita sobre mim e disse: "Não tenha medo. Eu sou o primeiro e o último. 18
Sou aquele que vive. Estive morto mas agora estou vivo para todo o sempre! E
tenho as chaves da morte e do Hades."
Apocalipse 1:17,18
Referências:
C# - Tasks x Threads. Qual a diferença
VB .NET - Datas, horas: conceitos e operações
C# - Programação Assíncrona como : Asycn e Task
Algoritmos de ordenação - Macoratti.net
NET - Números Perfeitos
SQL - O Algoritimo Soundex
C# - Estrutura de dados - Algorítmos
C# - Operadores Lógicos
C# - Apresentando Arrays
VB .NET - O Algorítmo de Euclides
C# - Usando delegates na prática - Ordenação
C# - Estrutura de dados - Algorítmos