本例对上一篇代码进行了改进。
一次循环同时找到最小和最大两个元素放在最左和最右。循环收敛到数组中间位置完成排序。
#!/bin/bash
#Selection-sort 1
arr=(101 0 35 27 90 87 99 51 6 33 37 28 62 90 111 222 333 550 22 18 5 11 17 23 50 78 30 61 9)
arrtotal=${#arr[@]}
let runend=(arrtotal)/2+1
let lastone=arrtotal-1
echo ${arr[@]}
echo "--->>>"
i=0
ii=0
tmpvaluemax=$arr[0]
tmpsitemax=0
while [ $i -lt $arrtotal ] ; do
tmpvalue=${arr[$i]}
tmpsite=$i
tmpvaluemax=${arr[$i]}
tmpsitemax=$i
flagmax=0
let tmpnext=i+1
for((j=$tmpnext;j<$arrtotal;j++)); do
if [ $tmpvalue -gt ${arr[$j]} ]; then
tmpvalue=${arr[$j]}
tmpsite=$j
flagmax=1
fi
if [ $tmpvaluemax -lt ${arr[$j]} ]; then
tmpvaluemax=${arr[$j]}
tmpsitemax=$j
flagmax=1
fi
let ii=ii+1
done
#echo "$tmpvaluemax $tmpsitemax $lastone"
if [ $i -ne $tmpsite ];then
temp=${arr[$i]}
arr[$i]=${arr[$tmpsite]}
arr[$tmpsite]=$temp
fi
if [ ${arr[$tmpsitemax]} -gt ${arr[$lastone]} ];then
tmpmax=${arr[$lastone]}
arr[$lastone]=${arr[$tmpsitemax]}
arr[$tmpsitemax]=$tmpmax
let arrtotal=arrtotal-1
let lastone=lastone-1
fi
let i=i+1
if [ $flagmax -eq 0 ]; then
break;
fi
flagemax=0
if [ $i -gt $runend ]; then
# echo $tmpsitemax
break;
fi
done
echo ${arr[@]}
echo "run loop:$i $ii"
echo $tmpsitemax
echo "END"