Shell脚本数组(实现冒泡排序,直接选择排序,反转排序)


数组

  • 数组中可以存放多个值(bash 只支持一维数组)
  • 数组元素的索引从0开始
  • 数组在括号内指定数组的值,每个值仅能用空格分割

在这里插入图片描述

其中:
30为索引0
20为索引1
10为索引2
60为索引3
以此类推,不过注意索引是从0开始的

如果数组中有三个参数:1 2 3
运行数组脚本后
"$*" 为 “1 2 3(作为一个整体使用)
"$@" 为“1” “2” “3” (分别作为单个的个体使用)
"$#" 为3 (表示参数的数量,也可以叫做长度)

不加双引号时与"@"的表现一致,加双引号时,会将数组arr1中的所有元素作为一个元素添加到数组中。
可以简单的理解为:用*号是作为一个整体,而用@还是单个的个体。

$*$@不加双引号时表现一致;加双引号时,$*会将所有参数作为一个整体。

数组定义方法

方法一:

数组名=(value0 valuel value2 …)

举例:
在这里插入图片描述

方法二:

数组名=( [0]=value [1]=value [2]=value …)

举例:
在这里插入图片描述

方法三:

列表名=“value0 valuel value2 …”
数组名=($列表名)

举例:
在这里插入图片描述

方法四:

数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”

举例:
在这里插入图片描述

数组包括的数据类型

数值类型
字符类型
使用" "或‘ ’定义

获取数组长度

在这里插入图片描述

读取某下标赋值

在这里插入图片描述

数组遍历

在这里插入图片描述
在这里插入图片描述

数组切片

取数组中的某一段的元素的值

格式:
${数组名[@或*]}:起始位置(起始索引):长度
在这里插入图片描述

数组替换

永久替换

格式:
$(数组名[@或*]/查找字符/替换字符}

在这里插入图片描述

删除数组

使用unset删除数组
在这里插入图片描述
删除数组中的某个索引对应的元素的值

在这里插入图片描述

追加数组中的元素

在数组中原有的元素后面再追加一些元素
在这里插入图片描述

从函数返回数组

调用新数组的元素进行函数运算

加法传参运算

在这里插入图片描述
在这里插入图片描述

乘法传参运算

在这里插入图片描述
在这里插入图片描述

数组排序算法

冒泡排序

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

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

算法思路:
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,
一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。

#!/bin/bash
abc=(20 10 60 40 50 30)          #定义一个数组
echo "原数组的排列顺序为:${abc[*]}"
length=${
    
    #abc[*]}                #定义原数组的长度为length变量
for ((i=1;i<$length;i++))        #定义排序轮次
do
  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[*]}"       #输出排序后的数组

在这里插入图片描述
在这里插入图片描述

直接选择排序

与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些。

基本思想:
将指定排序位置与其它数组元素分别对比,
如果满足条件就交换元素值,注意这里区别冒泡排序,
不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换
(如从最后一个元素开始排序) ,
这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。

#!/bin/bash
abc=(63 4 24 1 3 15)               #定义一个数组
echo "原数组的排列顺序为${abc[*]}" 
length=${
    
    #abc[*]}                   #定义原数组的长度,这里原数组的长度为6

for ((i=1;i<$length;i++))           #这里是定义比较的轮数,比较5次
do
  index=0                             #表示从索引0开始比较

  for ((k=1;k<=$length-i;k++))         #这里是确定用于比较的第一个元素的索引范围,比如已经定义了从索引0开始了,所以和0进行比较的范围就是从索引1-5了
   do
     first=${abc[$k]}                  #定义与index相比较的索引的取值为first
    if [ $first -gt ${abc[$index]} ]   #通过将index所在的索引的值与k所在的索引的值进行比较,获取最大元素的索引位置
    then
        index=$k
                #通过比较将较大的数定义到index中,进行下一轮的比较
    fi
       last=$[$length-$i]              #获取在比较的范围中的最后一个元素的索引
       temp=${abc[$last]}              #将上一步获取到的最后一个元素的索引的值保存到临时变量temp中
       abc[$last]=${abc[$index]}       #把最大上面for循环比较出来的最大元素的值赋值给最后一个元素
       abc[$index]=$temp               #把原来最后一个元素的值赋给原来最大值的位置的元素
   done
done

echo "排序后数组的排列顺序为${abc[*]}"   #输出排序后的数组

在这里插入图片描述
在这里插入图片描述

反转排序

以相反的顺序把原有数组的内容重新排序。

基本思想:
把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换。

#!/bin/bash
abc=(1 23 sf 43 s 6 we 8 9)
len=${
    
    #abc[*]}
echo "原来的数组排列顺序是:${abc[*]}"
for ((i=0;i<$len/2;i++))
do
      temp=${abc[$i]}
      abc[$i]=${abc[$len-$i-1]}
      abc[$len-$i-1]=$temp
done
     echo "反转后数组的排列顺序是:${abc[*]}"

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ll945608651/article/details/129736314
今日推荐