Hoy veremos cómo implementar el algoritmo de ordenamiento por selección en C. Se trata de implementar un algoritmo de selección para ordenar un arreglo.
Este algoritmo es ligeramente superior y más rápido al ordenamiento de burbuja.
Explicación del algoritmo
En lugar de recorrer todo el arreglo e intercambiar solo si el valor actual es mayor que el siguiente, en este caso simplemente buscamos el elemento menor de la lista y lo enviamos al primer lugar, luego seguimos buscando y al menor que encontremos lo cambiamos por el segundo.
De este modo intercambiamos el elemento más pequeño con el elemento i.
Intercambio de variables
Dentro del ciclo que recorre al arreglo y lo ordena, necesitamos intercambiar variables. Existen varias formas, una de ellas es declarar una temporal, asignar a la temporal el valor de A, asignar a A el valor de B y finalmente asignar a B el valor de A.
Yo prefiero hacerlo con valores por referencia, pues el código queda más legible. El funcionamiento es el mismo, pero encerramos todo en una función.
/*
Simple función que intercambia dos variables por referencia.
Más información en:
Funciones por referencia y por valor en C
*/
void intercambiar(int *a, int *b) {
int temporal = *a;
*a = *b;
*b = temporal;
}
Implementación de ordenamiento por selección
Hablar es de mal gusto; veamos el código. Simplemente recorremos el arreglo en dos ciclos, pero ahora, en el segundo, ya no recorremos desde 0 hasta n, sino que empezamos desde el valor de i + 1 pues podemos suponer que todos los valores a la izquierda ya están ordenados.
void seleccion(int arreglo[], int longitud) {
for (int i = 0; i < longitud - 1; i++) {
for (int j = i + 1; j < longitud; j++) {
if (arreglo[i] > arreglo[j]) {
// ...intercambiarlos, es decir, mover el actual a la derecha y el de la derecha al actual
intercambiar(&arreglo[i], &arreglo[j]);
}
}
}
}
Se puede observar que la función recibe un arreglo y la longitud del mismo. Lo recorre y lo ordena usando el método de selección u ordenamiento por selección.
Poniendo todo junto
Para terminar el post veamos cómo usar esta función. Queda así:
/*
____ _____ _ _ _
| _ \ | __ \ (_) | | |
| |_) |_ _ | |__) |_ _ _ __ _____| |__ _ _| |_ ___
| _ <| | | | | ___/ _` | '__|_ / | '_ \| | | | __/ _ \
| |_) | |_| | | | | (_| | | / /| | |_) | |_| | || __/
|____/ \__, | |_| \__,_|_| /___|_|_.__/ \__, |\__\___|
__/ | __/ |
|___/ |___/
Blog: https://parzibyte.me/blog
Ayuda: https://parzibyte.me/blog/contrataciones-ayuda/
Contacto: https://parzibyte.me/blog/contacto/
Copyright (c) 2020 Luis Cabrera Benito
Licenciado bajo la licencia MIT
El texto de arriba debe ser incluido en cualquier redistribución
*/
#include <stdio.h>
/*
Simple función que intercambia dos variables por referencia.
Más información en:
Funciones por referencia y por valor en C
*/
void intercambiar(int *a, int *b) {
int temporal = *a;
*a = *b;
*b = temporal;
}
void seleccion(int arreglo[], int longitud) {
for (int i = 0; i < longitud - 1; i++) {
for (int j = i + 1; j < longitud; j++) {
if (arreglo[i] > arreglo[j]) {
// ...intercambiarlos, es decir, mover el actual a la derecha y el de la derecha al actual
intercambiar(&arreglo[i], &arreglo[j]);
}
}
}
}
int main(void) {
// El arreglo
int arreglo[] = {30, 28, 11, 96, -5, 21, 18, 12, 22, 30, 97, -1, -40, -500};
/*
Calcular la longitud, puede ser definida por ti o calculada:
Longitud de un arreglo en C
*/
int longitud = sizeof arreglo / sizeof arreglo[0];
/*
Imprimirlo antes de ordenarlo
*/
printf("Imprimiendo arreglo antes de ordenar...\n");
for (int x = 0; x < longitud; x++) {
printf("%d ", arreglo[x]);
}
printf("\n");
seleccion(arreglo, longitud);
/*
Imprimirlo después de ordenarlo
*/
printf("Imprimiendo arreglo despues de ordenar...\n");
for (int x = 0; x < longitud; x++)
printf("%d ", arreglo[x]);
return 0;
}
Al ejecutarlo, la salida es la siguiente:
¿Más sobre el lenguaje C? click aquí.
muy buena explicacion, muchas gracias. <3