26 de dezembro de 2023
Algoritmo: Selection Sort
Algoritmos
Lógica
Selection sort é um algoritmo bem simples para ordenação. Ele consiste em dividir uma lista em duas partes: os que já foram ordenados e os que ainda não foram ordenados. O primeiro passo é percorrer a lista buscando seu menor valor. Ao encontrar esse valor, podemos armazenar seu índex (sua localização) e trocar este valor de lugar com o primeiro item não ordenado da lista. Em seguida, vamos passar do próximo item adiante e repetir esse processo. Simples assim. Façamos isso até o penúltimo item, pois o último naturalmente já será o maior da lista e estará no seu lugar correto - no caso de uma ordenação crescente.
Implementação
Vamos ver a implementação na linguagem C:
1#include <stdio.h>
2#include <stdlib.h>
3#include "utils/swap.h"
4
5int* selection_sort(int numbers[], int length){
6 int min_index, i, j;
7 for (int i = 0; i < length-1; i++) // {1}
8 {
9 min_index = i; // {2}
10 for (int j = min_index; j < length; j++)
11 {
12 if (numbers[min_index] > numbers[j]) { // {3}
13 min_index = j; // {4}
14 }
15 }
16 if (min_index != i) { // {5}
17 swap(&numbers[i], &numbers[min_index]); // {6}
18 }
19 }
20 return numbers;
21};
{1}: percorrer todos os elementos da lista até seu penúltimo item;
{2}: definir a posição do menor elemento da lista. Antes de percorrer a lista, este aponta para o primeiro elemento. Entretanto, ao encontrar um valor menor {3}, min_index é atualizado {4}. No final, teremos o menor item da parte não ordenada.
{5}: verificamos se esse valor é diferente de i, ou seja, se foi encontrado algum valor menor que o primeiro elemento. Se encontrou, trocamos a posição desse primeiro elemento da lista pelo menor valor encontrado {6}.
Swap é uma função auxiliar que pega a referência de dois números e os troca de lugar:
1void swap(int *first, int *second) {
2 int temp = *first; // {1}
3 *first = *second;
4 *second = temp;
5}
{1}: variável temporária, apenas para segurar a referência enquanto trocamos o valor da variável first.
Tempo de execução
Em seu pior caso, Selection Sort possui um tempo de execução de O(n²).
Referência
T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein, Introduction to Algorithms, 3rd edition, MIT Press, 2009.
Algoritmo SELECTION SORT | Algoritmos de Ordenação | Algoritmos #3