归并排序(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"