# Sort global array, \$list, starting from \$1 to up to \$2. 0 is # returned if everything went okay, and nonzero if there was an error. # We use the recursive quicksort of Tony Hoare with inline array # swapping to partition the array. The partition item is the middle # array item. String comparison is used. The sort is not stable. sort_list() { ((\$# != 2)) && return 1 typeset -i left=\$1 ((left < 0)) || (( 0 == \${#list[@]})) && return 2 typeset -i right=\$2 ((right >= \${#list[@]})) && return 3 typeset -i i=\$left; typeset -i j=\$right typeset -i mid; ((mid= (left+right) / 2)) typeset partition_item; partition_item="\${list[\$mid]}" typeset temp while ((j > i)) ; do item=\${list[i]} while [[ "\${list[\$i]}" < "\$partition_item" ]] ; do ((i++)) done while [[ "\${list[\$j]}" > "\$partition_item" ]] ; do ((j--)) done if ((i <= j)) ; then temp="\${list[\$i]}"; list[\$i]="\${list[\$j]}"; list[\$j]="\$temp" ((i++)) ((j--)) fi done ((left < j)) && sort_list \$left \$j ((right > i)) && sort_list \$i \$right return 0 } if [[ \$0 == *sorting.sh ]] ; then [[ -n \$ZSH_VERSION ]] && setopt ksharrays typeset -a list list=() sort_list -1 0 typeset -p list list=('one') typeset -p list sort_list 0 0 typeset -p list list=('one' 'two' 'three') sort_list 0 2 typeset -p list list=(4 3 2 1) sort_list 0 3 typeset -p list fi