aydarbiktimirov icon

visual-sort

aydarbiktimirov | PRO | 06/02/11 03:06:53 PM UTC | 0 ⭐ | 357 👁️ | Never ⏰ | []
Bash |

2.64 KB

|

None

|

0 👍

/

0 👎

#!/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