直接排序
#!/bin/bash
app=(55 66 16 9 8 20)
echo "排序前的数组的值为:${app[@]}"
length=${#app[@]}
#外层循环决定排序轮数,为数组长度减1,且从1开始
for ((a=1;a<length;a++))
do
#每轮比较初始最大元素的下标,从0开始,即第一个元素
i=0
#内层循环定义于和当前最大元素比较的元素下标范围,且每轮比较的最后一个元素下标会随着轮数增加而减少
for ((b=1;b<=length-a;b++))
do
#通过比较,获取当前轮数中最大元素的下标
if [ ${app[$i]} -lt ${app[$b]} ];then
i=$b
fi
done
#获取当前轮数的最后一个元素的下标
last=$[length -a]
#用临时变量获取当前轮数的最后一个元素的值
tmp=${app[$last]}
#将最大元素的值赋给当前轮数的最后一个元素
app[$last]=${app[$i]}
#将临时变量的值,和最后一个元素的值交换
app[$i]=$tmp
done
echo "排序后的数组的值为:${app[@]}"
直接插入排序
基本思想:
在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。按照此法对所有元素进行插入,直到整个序列有序。
但我们并不能确定待排元素中究竟哪一部分是有序的,所以我们一开始只能认为第一个元素是有序的,依次将其后面的元素插入到这个有序序列中来,直到整个序列有序为止。
算法步骤
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
#!/bin/bash
arr=(5 2 4 6 1 3)
echo "输出排序前数组:${arr[@]}"
length=${#arr[@]}
#外层循环定义待排序的元素下标位置
for ((a=1;a<length;a++))
do
#内层循环定义已经排好序的元素下标位置范围
for ((b=0;b<a;b++))
do
#将待排序的元素和前面已经排序好的元素依次比较,较小的元素会交换到已排好序的元素位置,较大的元素会放到待排序的元素位置
if [ ${arr[$b]} -gt ${arr[$a]} ]
then
tmp=${arr[$a]}
arr[$a]=${arr[$b]}
arr[$b]=$tmp
fi
done
done
echo "输出排序好的数组:${arr[@]}"
反转排序
以相反的顺序把原有数组的内容重新排序
基本思想:把数组倒数一个元素与第一个元素替换,倒数第二个和第二个元素替换,以此类推,直到把所有数组元素反转替换
#!/bin/bash
zzb=(1 2 3 4 5 6 7 8 9)
echo "排序前数组值为:${zzb[@]}"
length=${#zzb[@]}
for ((a=0;a<length/2;a++))
do
tmp=${zzb[$a]}
#获取当前轮数的最后一个元素下标,会随着轮数增加而减少
last=$[length-1-a]
zzb[$a]=${zzb[$last]}
zzb[$last]=$tmp
done
echo "排序后数组值为:${zzb[@]}"