Bash中的合并排序递归算法无法退出并返回值
我在bash中实现了一个合并排序算法,但看起来它会永远循环,并在m1和m2子数组上产生错误。在这种情况下停止循环有点困难,因为我必须使用echo而不是return。有人知道为什么会这样吗Bash中的合并排序递归算法无法退出并返回值,bash,shell,mergesort,Bash,Shell,Mergesort,我在bash中实现了一个合并排序算法,但看起来它会永远循环,并在m1和m2子数组上产生错误。在这种情况下停止循环有点困难,因为我必须使用echo而不是return。有人知道为什么会这样吗 MergeSort (){ local a=("$@") if [ ${#a[@]} -eq 1 ] then echo ${a[@]} elif [ ${#a[@]} -eq 2 ] then if [ ${a[0]} -gt ${a[1]} ]
MergeSort (){
local a=("$@")
if [ ${#a[@]} -eq 1 ]
then
echo ${a[@]}
elif [ ${#a[@]} -eq 2 ]
then
if [ ${a[0]} -gt ${a[1]} ]
then
local t=(${a[0]} ${a[1]})
echo ${t[@]}
else
echo ${a[@]}
fi
else
local p=($(( ${#a[@]} / 2 )))
local m1=$(MergeSort "${a[@]::p}")
local m2=$(MergeSort "${a[@]:p}")
local ret=()
while true
do
if [ "${#m1[@]}" > 0 ] && [ "${#m2[@]}" > 0 ]
then
if [ ${m1[0]} <= ${m2[0]} ]
then
ret+=(${m1[0]})
m1=${m1[@]:1}
else
ret+=(${m2[0]})
m2=${m2[@]:1}
fi
elif [ ${#m1[@]} > 0 ]
then
ret+=(${ret[@]} ${m1[@]})
unset m1
elif [ ${#m2[@]} > 0 ]
then
ret+=(${ret[@]} ${m2[@]})
unset m2
else
break
fi
done
fi
echo ${ret[@]}
}
a=(6 5 6 4 2)
b=$(MergeSort "${a[@]}")
echo ${b[@]}
MergeSort(){
本地a=(“$@”)
如果[${a[@]}-等式1]
然后
echo${a[@]}
elif[${a[@]}-等式2]
然后
如果[${a[0]}-gt${a[1]}]
然后
局部t=(${a[0]}${a[1]})
echo${t[@]}
其他的
echo${a[@]}
fi
其他的
局部p=($(${a[@]}/2)))
本地m1=$(合并排序“${a[@]::p}”)
本地m2=$(合并排序“${a[@]:p}”)
本地ret=()
虽然是真的
做
如果[“${m1[@]}”>0]&&[“${m2[@]}”>0]
然后
如果[${m1[0]}0]
然后
ret+=(${ret[@]}${m1[@]})
未设置m1
elif[${m2[@]}>0]
然后
ret+=(${ret[@]}${m2[@]})
未设置m2
其他的
打破
fi
完成
fi
echo${ret[@]}
}
a=(65642)
b=$(合并排序“${a[@]}”)
echo${b[@]}
您的shell脚本中存在多个问题:
- 对于数组长度的数值比较,应使用
而不是-gt
您的shell脚本中存在多个问题:
- 对于数组长度的数值比较,应使用
而不是-gt
您正在混合运算符。如果你使用
和数字,你必须使用[…]
,-gt
,-lt
和-ge
,但是你有时使用-le
或并且循环永远意味着你在
中永远不会碰到
。您可以使用中断
或set-x
查看执行情况。set-vx
将数组展平为字符串;您必须使用m2=${m2[@]:1}
。此外,请查看所有信息。当您使用m2=(“${m2[@]:1}”)
,m1=(“$(MergeSort“${a[@]::p}”)
时,它将成为一个包含单个元素的数组;在这种情况下,您必须取消引用m1
。您正在混合运算符。如果你使用$(…)
和数字,你必须使用[…]
,-gt
,-lt
和-ge
,但是你有时使用-le
或并且循环永远意味着你在
中永远不会碰到
。您可以使用中断
或set-x
查看执行情况。set-vx
将数组展平为字符串;您必须使用m2=${m2[@]:1}
。此外,请查看所有信息。当您使用m2=(“${m2[@]:1}”)
,m1=(“$(MergeSort“${a[@]::p}”)
时,它将成为一个包含单个元素的数组;在这种情况下,您必须取消引用m1
。$(…)
- 对于数组长度的数值比较,应使用