shell小技巧(六十九)归并排序

归并排序(Merge Sort)
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。 
算法描述
1.把长度为n的输入序列分成两个长度为n/2的子序列;
2.对这两个子序列分别采用归并排序;
3.将两个排序好的子序列合并成一个最终的排序序列。

代码实例:

#!/bin/bash
#merge sort
arr=(100 99 98 97 20 21 22 23 34 33 32 31 59 58 60 61 11 12 9)
echo ${arr[@]}
echo "--->>>"
let arrtotal=${#arr[*]}
let igroup=arrtotal/2
let lastone=arrtotal-1
echo "lastone:$lastone"
function mergeinitsort()
{
 step=2
 i=0 
 let iend=lastone-1
 while [ $i -le $iend ]; do
    let itmp=lastone-i
    if [ $itmp -ne 2 ]; then
      let ii=i+1
      if [ ${arr[$i]} -gt ${arr[$ii]} ]; then
         tmp=${arr[$i]}
         arr[$i]=${arr[$ii]}
         arr[$ii]=$tmp
      fi
    else
      let ii=i+1
      let iii=i+2
      if [ ${arr[$i]} -gt ${arr[$ii]} ]; then
         tmp=${arr[$i]}
         arr[$i]=${arr[$ii]}
         arr[$ii]=$tmp
      fi
      if [ ${arr[$i]} -gt ${arr[$iii]} ]; then
         tmp=${arr[$i]}
         arr[$i]=${arr[$iii]}
         arr[$iii]=$tmp
      fi
      if [ ${arr[$ii]} -gt ${arr[$iii]} ]; then
         tmp=${arr[$ii]}
         arr[$ii]=${arr[$iii]}
         arr[$iii]=$tmp
      fi
      
    fi
  let i=i+step
 done
}
function mergesort()
{
 a1=$1
 b1=$2
 abstep=$3
 abstep2=$4
 let a1e=a1+abstep-1
 let b1e=b1+abstep2-1
 while [ $a1 -le $a1e ]; do
   while [ $b1 -le $b1e ]; do
      if [ ${arr[$a1]} -le ${arr[$b1]} ]; then
             break;
      else
         abtmp=${arr[$a1]}
         arr[$a1]=${arr[$b1]}
         let b11=b1+1
         bb11=$b1
         while [ $b11 -le $b1e ]; do
            if [ $abtmp -gt ${arr[$b11]} ]; then
               arr[$bb11]=${arr[$b11]}
               arr[$b11]=$abtmp
            else
               arr[$bb11]=$abtmp
               break;
            fi
           let b11=b11+1
           let bb11=bb11+1
           if [ $b11 -gt $lastone ]; then
              break;
           fi
         done
      fi 
   done
   let a1=a1+1
 done
}
mergeinitsort
echo ${arr[@]}
echo "----"
xi1=0
xstep=2
xstep2=2
let xj1=xi1+xstep
let xi1e=xi1+xstep-1
let xj1e=xj1+xstep-1
if [ $xj1e -gt $lastone ]; then
  xj1e=$lastone
  let xstep2=xj1e-xj1+1
fi
while [ $xi1 -ge 0 ]; do
      mergesort $xi1 $xj1 $xstep $xstep2
      if [ $xj1e -eq $lastone ]; then
         break;
      fi
      let xi1e=xj1e
      let xj1=xi1e+1
      let xj1e=xj1e+2
      let xz=lastone-xj1e
      let xstep=xstep+2
   if [ $xz -eq 1 ]; then
     xj1e=$lastone
     let xstep2=xj1e-xj1+1
   fi
done
echo ${arr[@]}
echo "END"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值