Ordenamiento por selección en C - Ordenar arreglo
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.
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.
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:
*/void intercambiar(int *a, int *b) {
int temporal = *a;
*a = *b;
*b = temporal;
}
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.
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:
*/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:
*/ 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í.
El día de hoy vamos a ver cómo restablecer la impresora térmica GOOJPRT PT-210 a…
Hoy voy a enseñarte cómo imprimir en una impresora térmica conectada por USB a una…
En este post voy a enseñarte a programar un servidor web en Android asegurándonos de…
En este post te quiero compartir un código de C++ para listar y cancelar trabajos…
Gracias a WebAssembly podemos ejecutar código de otros lenguajes de programación desde el navegador web…
Revisando y buscando maneras de imprimir un PDF desde la línea de comandos me encontré…
Esta web usa cookies.
Ver comentarios
muy buena explicacion, muchas gracias. <3