Si bien es cierto, Bash es programa usado principalmente para interpretar órdenes que deberán actuar directamente sobre el sistema operativo que lo soporte como es el caso de UNIX. La sintaxis de órdenes de bash está compuesta por ideas que fueron tomadas de Korn Shell (ksh) y el C Shell (csh) y fue de cierta manera enriquecida gracias a la variedad de sentencias heredadas de sus predecesores.
El realizar a manera de práctica e introducción a Bash los métodos de ordenamiento más comunes que se suelen implementar al aprender un lenguaje de programación, sirve exclusivamente para aprender el funcionamiento de las estructuras repetitivas y de flujo, arreglos, operaciones lógicas y aritméticas y sentencias que son básicas para poder involucrarse en la programación en bash, el cual, posteriormente debería ser llevada a una dimensión real realizando scripts que permitirán la automatización de tareas recurrentes que realizamos dentro del sistema operativo como operaciones con ficheros, procesos, comandos, etc.
A continuación, se detallan los métodos de ordenamiento:
1.- Ordenamiento de Burbuja.
El método de ordenamiento burbuja consiste en comparar cada elemento de la estructura con el siguiente e intercambiándolos si corresponde. El proceso se repite hasta que la estructura esté ordenada. El orden se establece de acuerdo con la clave y la estructura tiene que tener acceso directo a sus componentes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/bash function burbuja { lista=$1 tam=${#lista[@]} for i in $(seq 1 $[$tam-1]); do for j in $(seq 0 $[$tam - $i - 1]); do if [ ${lista[$j]} -gt ${lista[$j+1]} ] ; then k=${lista[$[$j+1]]} lista[$j+1]=${lista[$j]} lista[$j]=$k fi done done } lista=(5 4 3 2 1) burbuja $lista for i in ${lista[@]};do echo $i; done |
2.- Ordenamiento Shell.-
El método de ordenamiento Shell consiste en dividir el arreglo (o la lista de elementos) en intervalos (o bloques) de varios elementos para organizarlos después por medio del ordenamiento de inserción directa. El proceso se repite, pero con intervalos cada vez más pequeños, de tal manera que al final, el ordenamiento se haga en un intervalo de una sola posición, similar al ordenamiento por inserción directa, la diferencia entre ambos es qué, al final, en el método ShellSu nombre proviene de su creador, Donald Shell, y no tiene que ver en la forma como funciona el algoritmo. los elementos ya están casi ordenados.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/bin/bash function shell { lista=$1 tam=${#lista[@]} for inc in $(seq 1 $[$[inc*3]+1] $[$tam-1]) ; do while [ $inc -gt 0 ] ; do for i in $(seq $inc $[$tam-1]) ; do j=$i temp=${lista[$i]} while [[ $j -ge $inc && ${lista[$[$j-$inc]]} -gt $temp ]] ; do lista[$j]=${lista[$[$j-$inc]]} j=$[$j-$inc] done lista[$j]=$temp done inc=$[$inc/2] done done } lista=(5 4 3 2 1) shell $lista for i in ${lista[@]};do echo $i; done |
3.- Ordenamiento Quicksort.-
El método Quick Sort es actualmente el más eficiente y veloz de los métodos de ordenación interna. Es también conocido con el nombre del método rápido y de ordenamiento por partición.
Este método es una mejora sustancial del método de intercambio directo y recibe el nombre de Quick Sort, por la velocidad con la que ordena los elementos del arreglo.
Quicksort es un algoritmo basado en la técnica de divide y vencerás, que permite, en promedio, ordenar n elementos en un tiempo proporcional a n log n.
Quicksort es actualmente el más eficiente y veloz de los métodos de ordenación interna.
Este método fue creado por el científico británico Charles Antony Richard Hoare, también conocido como Tony Hoare en 1960, su algoritmo Quicksort es el algoritmo de ordenamiento más ampliamente utilizado en el mundo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#!/bin/bash function quicksort { lista=$1 izq=$2 der=$3 i=$izq; j=$der; x=${lista[$[$[$izq + $der]/2]]} while [ $i -le $j ] ; do while [[ ${lista[$i]} -lt $x && $j -le $der ]] ; do i=$[$i+1] done while [[ $x -lt ${lista[$j]} && $j -gt $izq ]] ; do j=$[$j-1] done if [ $i -le $j ] ; then aus=${lista[$i]}; lista[$i]=${lista[$j]}; lista[$j]=$aus; i=$[$i+1]; j=$[$j-1] fi done if [ $izq -lt $j ] ; then quicksort $lista $izq $j fi if [ $i -lt $der ] ; then quicksort $lista $i $der fi } lista=(5 4 3 2 1) quicksort $lista 0 $[${#lista[@]}-1] for i in ${lista[@]};do echo $i; done |
4.- Ordenamiento por Inserción Directa. –
El método de ordenación por inserción directa consiste en recorrer todo el array comenzando desde el segundo elemento hasta el final. Para cada elemento, se trata de colocarlo en el lugar correcto entre todos los elementos anteriores a él o sea entre los elementos a su izquierda en el array.
Dada una posición actual p, el algoritmo se basa en que los elementos A[0], A[1], …, A[p-1] ya están ordenados.
En el peor de los casos, el tiempo de ejecución en O(n2).
En el mejor caso (cuando el array ya estaba ordenado), el tiempo de ejecución de este método de ordenamiento es O(n).
El caso medio dependerá de cómo están inicialmente distribuidos los elementos. Cuanto más ordenada esté inicialmente más se acerca a O(n) y cuanto más desordenada, más se acerca a O(n2).
El peor caso el método de inserción directa es igual que en los métodos de burbuja y selección, pero el mejor caso podemos tener ahorros en tiempo de ejecución.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/bash function inserciondirecta { lista=$1 tam=${#lista[@]} for i in $(seq 1 $[$tam-1]) ; do v=${lista[$i]} j=$[$i-1] while [[ $j -ge 0 && ${lista[$j]} -gt $v ]] ; do lista[$[$j+1]]=${lista[$j]} j=$[$j-1] done lista[$[$j+1]]=$v done } lista=(5 4 3 2 1) inserciondirecta $lista for i in ${lista[@]};do echo $i; done |
5.- Ordenamiento por Inserción Binaria. –
El ordenamiento binario es un algoritmo de ordenación de tipo comparación. Es una modificación del algoritmo de ordenamiento por inserción. En este algoritmo, también mantenemos una submatriz ordenada y otra sin ordenar. La única diferencia es que encontramos la posición correcta de un elemento utilizando la búsqueda binaria en lugar de la búsqueda lineal. Esto ayuda a acelerar el algoritmo de ordenación reduciendo el número de comparaciones necesarias.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#!/bin/bash function insercionbinaria { lista=$1 tam=${#lista[@]} for i in $(seq 1 $[$tam-1]) ; do aus=${lista[$i]} izq=0; der=$[$i-1] while [ $izq -le $der ] ; do m=$[$[$izq+$der]/2] if [ $aus -lt ${lista[$m]} ] ; then der=$[$m-1] else izq=$[$m+1] fi done j=$[$i-1] while [ $j -ge $izq ] ; do lista[$[$j+1]]=${lista[$j]} j=$[$j-1] done lista[$izq]=$aus done } lista=(5 4 3 2 1) insercionbinaria $lista for i in ${lista[@]};do echo $i; done |
6.- Ordenamiento por Selección. –
Este algoritmo mejora ligeramente el algoritmo de la burbuja. En el caso de tener que ordenar un vector de enteros, esta mejora no es muy sustancial, pero cuando hay que ordenar un vector de estructuras más complejas, la operación de intercambiar los elementos sería más costosa en este caso.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/bash function selectionsort { lista=$1 tam=${#lista[@]} for i in $(seq 0 $[$tam-2]) ; do min=$i for j in $(seq $[$i+1] $[$tam-1]) ; do if [ ${lista[$min]} -gt ${lista[$j]} ] ; then min=$j fi done aus=${lista[$min]} lista[$min]=${lista[$i]} lista[$i]=$aus done } lista=(5 4 3 2 1) selectionsort $lista for i in ${lista[@]};do echo $i; done |