Linux 私房菜————Shell脚本命令(五)数组排序|顺序排序|选择排序|冒泡排序|

1.数组定义

  • 以空格为分割
  • 数组的单位叫元素
  • 从左往右从0开始索引[下标]

1.1 最常见的的方法一

数组名=(vaule0 vaule1 vaule2 ...)

1.2 需要覆盖原有数组内容的方法二

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

1.3 覆盖原有数组内容方法三

  • 覆盖原有数组内容
列表名="vaule0 vaule1 vaule2 ..."
数组名=($列表名)

1.4 最灵活的方法四

  • 最灵活
数组名[0]="vaule"
数组名[1]="vaule"
数组名[2]="vaule"

1.5 例题

#!/bin/bash
a=0
for((i=1;i<=9;i++))
{
  b[$a]=$i
  let a++
}
echo ${b[*]}

在这里插入图片描述

2.数组的数据类型

  • 数值类型 | 字符类型
  • 使用" "或’ '定义

2.1 获得数组长度

echo ${#b[@]}
echo ${#b[*]}

在这里插入图片描述

2.2 获取数组内容

echo ${b[@]}
echo ${b[*]}

在这里插入图片描述

2.3 读取下标所指赋值

echo ${b[下标]}

在这里插入图片描述

当加上双引号后*将会变成整体

b=(1 2 3 4 5 6 7 8 9)
for i in ${b[*]}
{
  echo $i
}

在这里插入图片描述

3.数组切片输出

  • 获取b所有数据中索引号从0开始到第6个元素,没有定义的元素不会输出
b=(1 2 3 4 5 6 7 8 9)
echo ${b[@]:0:6}

在这里插入图片描述

4.删除数组的内容

  • 删除数组
b=(1 2 3 4 5 6 7 8 9)
unset b
echo ${b[@]}

在这里插入图片描述

  • 删除指定索引的元素
b=(1 2 3 4 5 6 7 8 9)
unset b[1][2]
echo ${b[@]}

在这里插入图片描述

5.替换数组的内容

  • 将查找的字符0临时替换为3,下一次执行依旧是在原有数值进行替换
  • 如果需要保存就先赋值
b=(10 20 30 40 50)
echo ${b[@]/0/8}

在这里插入图片描述

6.追加数组内容

6.1 方法一

array[index]=value

6.2 方法二

array+=(vaule1 ... valueN)

6.3 方法三

  • 如果加上双引号后*的情况下将会在最后一个索引处追加元素,它们为同一个整体
array=("$(array[@])" vaule1 ... valueN)

6.4 方法四

array[${#array[@]}]=value

7.向函数传数组参数

  • 如果将数组作为函数参数,参数只会取数组的遍历的第一个值
dmo(){
  echo $@
  a=($i)
  echo ""新数组的值为 ${a[*]}

如果将数组遍历作为函数参数

demo(){
  newarrary=($@)
  for ((i=0;i<=$[$# - 1];i++)){
     newarrary[$i]=$[${newarrary[$i]} * 2]
  }
  echo ${newarrary[*]}
}

array=(3 2 1 4 5)
echo "原始数组的值为: ${array[*]}"
result1=`demo ${array[*]}`
echo "新数组的和为:$result1"

在这里插入图片描述

8.直接选择排序

  • 与冒泡排序相比,直接选择排序的交换次数更少,速度更快

8.1基本思想

  • 直接找到最大值丢到后面,而不需要一个一个判断
array=($RANDOM $RANDOM $RANDOM $RANDOM $RANDOM)
echo "原数组为:${array[*]}"

long=${#array[*]}

for ((i=1;i<$long;i++)){
  index=0
  for ((k=1;k<=long-i;k++)){
      one=${array[$index]}
      two=${array[$k]}
      if [ $two -gt $one ];then
         index=$k
      fi
      last=$[$long-$i]
      temp=${array[$last]}
      array[$last]=${array[$index]}
      array[$index]=$temp
  }
}
echo "排序后的数组为:${array[*]}"

在这里插入图片描述

9.冒泡算法

  • 比较两个相邻的元素,将值大的元素交换到右边

9.1 算法思路

  • 依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面

9.2 方法一

array=(2 4 3 5 1)
echo "旧数组值:${array[*]}"
a=${#array[*]}
for ((i=1;i<a;i++)){
  for ((j=0;j<a-i;j++)){
    if [ ${array[j]} -gt ${array[j+1]} ];then
       bak=${array[j]}
       array[j]=${array[j+1]}
       array[j+1]=$bak
    fi
  }
}
echo "新数组值:${array[*]}"

在这里插入图片描述

9.3方法二

#!/bin/bash
paixu() {
array=($@)
echo "旧数组值:${array[*]}"
a=${#array[*]}
for ((i=1;i<a;i++)){
  for ((j=0;j<a-i;j++)){
    if [ ${array[j]} -gt ${array[j+1]} ];then
       bak=${array[j]}
       array[j]=${array[j+1]}
       array[j+1]=$bak
    fi
  }
}
echo "新数组值:${array[*]}"
}

list=$@
paixu $list

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值