#!/bin/bash
ARR=()
function read_array()
{
for i in $(seq 1 $#)
do
ARR[$i]=$1
shift
done
}
function print_array()
{
interval=$1
shift
__k=$1
shift
__l=$1
shift
echo -en '\r'
for __i in $(seq 1 $1)
do
if [ "$__i" -eq "$__k" ]
then
echo -en '\033[1;33m'
fi
if [ "$__i" -eq "$__l" ]
then
echo -en '\033[1;31m'
fi
echo -n "${ARR[$__i]} "
if [ "$__i" -eq "$__k" -o "$__i" -eq "$__l" ]
then
echo -en '\033[0m'
fi
done
sleep $interval
}
function swap()
{
TMP=${ARR[$1]}
ARR[$1]=${ARR[$2]}
ARR[$2]=$TMP
}
function bubble_sort()
{
for i in $(seq 1 $#)
do
for j in $(seq $# -1 $(($i + 1)))
do
print_array 1 $(($j - 1)) $j $#
if [ "${ARR[$(($j - 1))]}" -gt "${ARR[$j]}" ]
then
swap $((j - 1)) $j
print_array 1 $j $(($j - 1)) $#
fi
done
done
}
function insertion_sort()
{
for i in $(seq 2 $#)
do
for j in $(seq $i -1 2)
do
print_array 1 $(($j - 1)) $j $#
if [ "${ARR[$(($j - 1))]}" -le "${ARR[$j]}" ]
then
break
fi
swap $j $(($j - 1))
print_array 1 $j $(($j - 1)) $#
done
done
}
function selection_sort()
{
for p in $(seq 1 $#)
do
m=$p
for i in $(seq $(($p + 1)) $#)
do
print_array 1 $m $i $#
if [ "${ARR[$m]}" -gt "${ARR[$i]}" ]
then
m=$i
fi
done
if [ "$m" -ne "$p" ]
then
swap $m $p
print_array 1 $p 0 $#
fi
done
}
function shell_sort()
{
d=$#
while [ "$d" -gt "1" ]
do
d=$(($d / 2))
flag=0
while [ "$flag" -eq "0" ]
do
flag=1
for j in $(seq 1 $(($# - $d)))
do
i=$(($j + $d))
print_array 1 $i $j $#
if [ "${ARR[$j]}" -gt "${ARR[$i]}" ]
then
swap $j $i
print_array 1 $j $i $#
flag=0
fi
done
done
done
}
function gnome_sort()
{
i=2
while [ "$i" -le "$#" ]
do
print_array 1 $(($i - 1)) $i $#
if [ "${ARR[$(($i - 1))]}" -le "${ARR[$i]}" ]
then
i=$(($i + 1))
else
swap $(($i - 1)) $i
print_array 1 $i $(($i - 1)) $#
if [ "$i" -gt "2" ]
then
i=$(($i - 1))
else
i=$(($i + 1))
fi
fi
done
}
function main()
{
SORT=$1
shift
read_array $@
case $SORT in
bubble)
bubble_sort $@;;
insertion)
insertion_sort $@;;
selection)
selection_sort $@;;
shell)
shell_sort $@;;
gnome)
gnome_sort $@;;
*)
echo -e "Sort visualizations\nUsage: \033[1m$0\033[0m [ \033[1;32mbubble\033[0m | \033[1;32minsertion\033[0m | \033[1;32mselection\033[0m | \033[1;32mshell\033[0m | \033[1;32mgnome\033[0m ] \033[36mARRAY\033[0m"
exit;;
esac
print_array 0 0 0 $#
echo
}
main $@
Comments