Buble sort en el bash de linux

Buble sort en el bash de linux

Como algunos sabréis, existe un método en programación llamado burbuja, que nos sirve para ordenar vectores, tanto por orden alfabético como numérico. El sistema usado es básicamente el mismo en los distintos lenguajes de programación, podéis leer mas al respecto aquí y ver algunos ejemplos: http://es.wikipedia.org/wiki/Ordenamiento_de_burbuja

Curiosidades de la vida,me encontré la necesidad de ordenar un vector en un Shell Script de Linux, y aunque lo realice de forma diferente,ja que con un simple bucle “for” y el comando sort obtuve el resultado que quería, me encontré por la red esto que cuanto menos es curioso.

Se trata de la implementación del método burbuja traducida para un script en bash, como ya digo anteriormente,algo,cuanto menos curioso.

Os dejo el codigo:

#!/bin/bash
# bubble.sh: Bubble sort, of sorts.

exchange()
{
# Swaps two members of the array.
local temp=${Countries[$1]} #  Temporary storage
#+ for element getting swapped out.
Countries[$1]=${Countries[$2]}
Countries[$2]=$temp

return
}

declare -a Countries  #  Declare array,
#+ optional here since it’s initialized below.

#  Is it permissable to split an array variable over multiple lines
#+ using an escape (\)?
#  Yes.

Countries=(Netherlands Ukraine Zaire Turkey Russia Yemen Syria \
Brazil Argentina Nicaragua Japan Mexico Venezuela Greece England \
Israel Peru Canada Oman Denmark Wales France Kenya \
Xanadu Qatar Liechtenstein Hungary)

# “Xanadu” is the mythical place where, according to Coleridge,
#+ Kubla Khan did a pleasure dome decree.

clear                      # Clear the screen to start with.

echo “0: ${Countries[*]}”  # List entire array at pass 0.

number_of_elements=${#Countries[@]}
let “comparisons = $number_of_elements – 1”

count=1 # Pass number.

while [ “$comparisons” -gt 0 ]          # Beginning of outer loop
do

index=0  # Reset index to start of array after each pass.

while [ “$index” -lt “$comparisons” ] # Beginning of inner loop
do
if [ ${Countries[$index]} \> ${Countries[`expr $index + 1`]} ]

then
exchange $index `expr $index + 1`  # Swap.
fi
let “index += 1”  # Or,   index+=1   on Bash, ver. 3.1 or newer.
done # End of inner loop

let “comparisons -= 1” #  Since “heaviest” element bubbles to bottom,
#+ we need do one less comparison each pass.

echo
echo “$count: ${Countries[@]}”  # Print resultant array at end of each pass.
echo
let “count += 1”                # Increment pass count.

done                            # End of outer loop
# All done.

exit 0

El shell script posee un vector o array con los distintos nombres de países desordenados,y con una función nos va comparando uno a uno los elementos del vector y copiándolos en otro vector auxiliar.En ocasiones uno se sorprende de las cosas que se pueden hacer con algo tan simple, ésta es una de ellas.

Un saludo a tod@s.

Juan Antonio Vicent.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s