Shell数组:冒泡排序算法



数组排序算法:冒泡排序

冒泡排序算法会不断比较相邻的两个元素,将较小的元素移动到数组的前面。

类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。

在实际应用中,冒泡排序适用于对小规模数据进行排序。

  • 基本思想

    对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置) ,这样较小的元素就像气泡一样从底部上升到顶部。

  • 算法思路

    冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减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[*]}"

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值