shell脚本中数组的运用以及排序算法

一、数组的介绍

1、概念

数组:数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用。

2、定义方法

方法一):

数组名=(value0 value1 value2 ....)

方法二):

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

方法三):

列表名=“value0 value1 value2 ....”
数组名=($列表名)

方法四):

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

3、数组包括的数据类型

  • 数值类型
  • 字符类型

字符类型要是应用双引号或单引号定于

二、关于数组的操作

1、获取数组长度

a=(1 2 3 4 5)
b=${#a[*]}
或
b=${#a[@]}

在这里插入图片描述

2、获取数组各个元素的下标

echo ${!a[@]}
或
echo ${!a[*]}

在这里插入图片描述

3、获取数组列表或单个元素

#获取数组列表
echo ${a[*]}
或
echo ${a[@]}

在这里插入图片描述

#获取单个元素
echo

在这里插入图片描述

4、对数组切片输出

 #将i数组的33 44 55输出
 i=(11 22 33 44 55)
 echo ${i[@]:1:3} 

在这里插入图片描述

5、对数组里的元素替换

a=(10 20 30 40 100)
echo ${a[@]/10/60}      //此方法替换只是输出时替换,但原数组并没有被替换

在这里插入图片描述

#永久替换相当于重新定义数组
b=(1 2 3 4 5)
b=(${b[@]/2/6})
echo ${b[@]}

在这里插入图片描述

6、删除单个元素或数组

#删除单个元素
c=(1 2 3 4 5 6)
echo ${!c[@]}
unset c[5]
echo ${c[@]}

#删除数组
unset c
echo ${c[@]}

在这里插入图片描述
注意:如果下标为0 1 2 3 4,把3删除了,下标就变成了0 1 2 4,不是0 1 2 3。

7、数组追加元素

方法一)
array_name[index]=value
方法二)
array_name[${#array_name[@]}]=value
方法三)
array_name=("${array_name[@]}" value1 ... valueN)
#双引号不能省略,否则,当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个。不能将"@"替换成“*”,不加双引号时与“@”表现一致,加双引号时,会将数组array_name中所有的元素作为一个元素添加到数组中
方法四)
array_name+=(value1 value2 ... valueN)
待添加元素必须用“()”包围起来,并且多个元素用空格分隔

方法一
在这里插入图片描述
方法二
在这里插入图片描述
方法三
在这里插入图片描述
方法四
在这里插入图片描述

8、向函数传入数组的值

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

三、数组排序算法

1、冒泡排序

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

基本思想

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

算法思路

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

实现

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

2、直接选择排序

基本思想

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

实现

#!/bin/bash
shuzu=(63 4 24 1 3 15)
length=${#shuzu[@]}

for ((a=1;a<length;a++))
do
  i=0
  for ((b=1;b<=length-a;b++))
  do
    if [ ${shuzu[$i]} -lt ${shuzu[$b]} ]
    then
      i=$b
    fi
  done
  last=$[length - a]
  tmp=${shuzu[$last]}
  shuzu[$last]=${shuzu[$i]}
  shuzu[$i]=$tmp
done
echo "排序后的数组值为:${shuzu[@]}"                              

在这里插入图片描述

3、直接插入排序

定义

插入排序,又叫直接插入排序。实际中,我们玩扑克牌的时候,就用了插入排序的思想

基本思想

在待排序的元素中,假设前n-1元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序,按照此法对所有的元素进行插入,直到整个序列有序。
但是我们并不能确定待安排元素中究竟哪儿一部分是有序的,所以我们一开始只能认为第一个元素是有序的,一次将后的元素插入到这个有序序列中来,直到整个序列有序为止。
在这里插入图片描述

实现

#!/bin/bash
arr=(5 2 4 6 1 3)
length=${#arr[@]}
echo "排序前的数组为:${arr[@]}"
for ((a=1;a<length;a++))
do
  for ((b=0;b<a;b++))
  do
    if [ ${arr[$a]} -lt ${arr[$b]} ]
    then
      tmp=${arr[$a]}
      arr[$a]=${arr[$b]}
      arr[$b]=$tmp
    fi
  done
done

echo "排序后的数组为:${arr[@]}"

在这里插入图片描述

4、反转排序

定义

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

基本思想

把数组最后一个元素和第一个元素替换,倒数第二个元素和第二个元素替换,依此类推,直到把所有数组反转替换。

实现

#!/bin/bash
arr=(1 2 3 4 5)
echo "反转排序前的数组为:${arr[@]}"
length=${#arr[@]}
for ((a=0;a<length/2;a++))
do
  tmp=${arr[$a]}
  arr[$a]=${arr[$length-1-a]}
  arr[$length-1-a]=$tmp
done

echo "反转排序后的数组为:${arr[@]}"

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值