Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash中的合并排序递归算法无法退出并返回值_Bash_Shell_Mergesort - Fatal编程技术网

Bash中的合并排序递归算法无法退出并返回值

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]} ]

我在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]} ]
    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
      时,它将成为一个包含单个元素的数组;在这种情况下,您必须取消引用
      $(…)