数组排序算法:冒泡排序
冒泡排序算法会不断比较相邻的两个元素,将较小的元素移动到数组的前面。
类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。
在实际应用中,冒泡排序适用于对小规模数据进行排序。
-
基本思想:
对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置) ,这样较小的元素就像气泡一样从底部上升到顶部。
-
算法思路:
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。
示例:冒泡排序数组
#!/bin/bash
abc=(20 10 60 40 50 30) #定义一个数组
echo "原数组的排列顺序为:${abc[*]}"
length=${#abc[*]} #定义原数组的长度为length变量
for ((i=1;i<$length;i++))
#定义排序轮次
do
echo $i
for ((k=0;k<$length-i;k++))
#控制元素比较,确定第一个元素的索引位置
do
first=${abc[$k]} #定义第一个元素的值
j=$[$k+1] #定义第二个元素的索引号
second=${abc[$j]} #定义第二个元素的值
if [ $first -gt $second ]
#第一个元素和第二个元素比较,如果第一个元素比第二个元素大则互换
then
temp=$first #把第一个元素的值保存在临时变量temp中
abc[$k]=$second #把第二个元素的值赋给第一个元素
abc[$j]=$temp #把原第一个元素的值,赋给第二个元素
fi
done
done
echo "排序后数组的排列顺序为${abc[*]}" #输出排序后的数组
执行结果:
[root@localhost shuzu1]# ./g.sh
原数组的排列顺序为:20 10 60 40 50 30
排序后数组的排列顺序为10 20 30 40 50 60
解释说明:
for 内层循环(第一轮5次)->最大值
abc=(20 10 60 40 50 30)
第一次循环
abc=(10 20 60 40 50 30)
第二次循环
abc=(10 20 60 40 50 30)
第三次循环
abc=(10 20 40 60 50 30)
第四次循环
abc=(10 20 40 50 60 30)
第五次循环
abc=(10 20 40 50 30 60)
# 2
for 内层循环的(第二轮4次)
原始数组:abc=(10 20 40 50 30 60)
第一次循环
abc=(10 20 40 50 30 60)
第二次循环
abc=(10 20 40 50 30 60)
第三次
abc=(10 20 40 50 30 60)
第四次
abc=(10 20 40 30 50 60)
逻辑上看,以从小到大排序方式来看
内层循环是为了将此次比较中的最大数放在最右侧(1个)
外层循环是为了将数组的最大数依次放到最右侧(每次循环比较次数降低)
练习:对磁盘空间大小进行正向排序
使用 df -h
命令获取磁盘空间信息,并对其进行排序:
#!/bin/bash
disk=(`df -h | awk 'NR>1 {print $5}' | tr -d '%'`)
# 提取磁盘使用率
IFS=$'\n' sorted=($(sort -n <<<"${disk[*]}"))
# 使用排序命令进行排序
unset IFS
echo "排序后的磁盘使用率为:${sorted[*]}"