shell编程数组与冒泡算法排序详解

  • 一、数组的四种表达方式
  • 二 、数组的增删改查操作
  • 三 、数组传参
    • 3.1 主程序向函数传数组参数
    • 3.2 从函数返回数组到主程序
  • 四 、冒泡算法排序

一、数组的四种表达方式

方法1:
数组名=(value0 value1 value2 …)
方法2:
数组名=([0]=value [1]=value [2]=value)
方法3:
列表名=“value0 value1 value2 …”
数组名=($列表名)
方法4:
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
……

二 、数组的增删改查操作

获取数组的长度
arr_length=${#arr_number[*]}
数组切片

[root@localhost ~]# a=(1 2 3 4 5)
[root@localhost ~]# echo ${a[*]}       //输出整个数组
1 2 3 4 5
[root@localhost ~]# echo ${a[@]:0:2}  #${数组名[@或*]:起始位置:长度]
1 2
[root@localhost ~]# echo ${a[@]:2:3}
3 4 5
注意:将数组切片之后,返回的是字符串,以空格作为分隔符

数组替换

arr=(1 2 3 4 5)
echo ${arr[@]/4/66}  //${数组名[@或*]/查找字符/替换字符}
1 2 3 66 5
echo ${arr[@]}       //并不会替换数组原有内容
1 2 3 4 5
a=(${arr[@]/4/66})        //要实现改变原有数组,可通过重新赋值实现
echo ${arr[*]}
1 2 3 66 5

删除数组

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# unset arr      //删除整个数组[root@localhost ~]# unset arr[2]       //删除第三个元素
[root@localhost ~]# echo ${arr[*]}
1 2 4 5

数组添加元素

方法1 array_name[index]=value
方法2 array_name[${#array_name[@]}]=value
方法3 array_name=("${array_name[@]}" value1 ... valueN)
方法4 array_name+=(value1 value 2 ... valueN)

注意:
"${array_name[@]}"中双引号不能省略,否则当数组array_name中出现包含
空格的元素时会按空格将元素拆分成多个

不能把@替换成*,否则在加双引号时会把数组array_name中的所有元素作为一个元素添加到数组中

三 、数组传参

3.1 主程序向函数传数组参数

在函数中调用数组的时候可能会出现下面的问题

#!/bin/bash
test1() {echo "函数接收到的列表为:$@"
newarray=$1
echo ${newarray[*]}
}
array=(3 2 1 4 5)
echo "原始的数组值为${array[*]}"
test1 $array

运行结果如下图所示

此时需要将数组变量的值分解成单个的值,然后把这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量。
演示代码如下:

#!/bin/bash
test2() {newarray=($(echo $@))     //$@会把接收到的所有的位置参数都表示出来,并且分割成单个元素。此处也可以写成newarray=($@)
echo "新数组的值为:${newarray[*]}"
}
array=(3 2 1 4 5)
echo "原始的数组值为${array[*]}"
test2 ${array[*]}       //此处{}必加,表示把这个数组看作一个整体

运行结果如下

3.2 从函数返回数组到主程序

test3() {newarray=(`echo $@`)
for((i=0;i<$#;i++))
{newarray[$i]=$[${newarray[$i]}*2]
}
echo ${newarray[*]}
}array=(3 2 1 4 5)
result=($(test3 ${array[*]}))
echo "新数组的值为:${result[*]}"

四 、冒泡算法排序

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

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

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

代码实现

#!/bin/bash
paixu() {array=($1)
for ((i=1;i<${#array[*]};i++)) ##比较轮数为数组长度减1,从1开始
dofor ((j=0;j<${#array[*]}-i;j++))  ##比较相邻两个元素,较大的数往后放,比较次数随比较比较轮数而减少doif [ ${array[$j]} -gt ${array[$[$j+1]]} ]  ##如果第一个元素比第二个元素大就互换thentemp=${array[$j]}  ##把第一个元素值保存在临时变量中array[$j]=${array[$[$j+1]]}  ##把第二个元素值保存到第一个元素中array[$[$j+1]]=$temp  ##把临时变量(也就是第一个元素原值),保存到第二个元素中fidone
done
echo ${array[*]}
}
#主体代码
f=$(cat $1)
paixu $f

运行结果如下

秒懂的shell编程数组与冒泡算法排序详解相关推荐

  1. shell编程数组与冒泡算法排序详解

    shell编程数组与冒泡算法排序详解 一 数组的四种表达方式 二 数组的增删改查操作 三 数组传参 3.1 主程序向函数传数组参数 3.2 从函数返回数组到主程序 四 冒泡算法排序 一 数组的四种表达 ...

  2. 粒子群优化算法和python代码_Python编程实现粒子群算法(PSO)详解

    1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的.假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位 ...

  3. linux shell编程if语句内判断参数详解【ZT】

                  shell 编程中使用到得if语句内判断参数 –b 当file存在并且是块文件时返回真 -c 当file存在并且是字符文件时返回真 -d 当pathname存在并且是一个目 ...

  4. Linux从入门到精通系列之SHELL编程循环语句语法及实例详解(forwhileuntil)

    前言 Shell作为一种脚本编程语言,同样了包含了循环,分支等其他程序控制结构,从而能够轻松完成更加复杂.强大的功能.我们今天就来认识for.while.case语句的具体应用. 插个小广告吧,虽然我 ...

  5. Python编程实现粒子群算法(PSO)详解

    1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的.假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位 ...

  6. shell脚本编程神器之awk语法案例详解

    AWK入门指南 文章目录 shell脚本编程神器之awk语法案例详解 安装AWK AWK 起步示例 AWK程序的结构 执行 awk 程序 awk 的错误提示 简单输出 打印每一行 打印特定行 NF,字 ...

  7. 希尔排序基础java代码_java 算法之希尔排序详解及实现代码

    摘要:这篇Java开发技术栏目下的"java 算法之希尔排序详解及实现代码",介绍的技术点是"希尔排序详解.实现代码.希尔排序.Java.实现.代码",希望对大 ...

  8. DES加解密算法原理详解与实现

    [DES密码编写] 1. Equipment (1) operating system version :WIN 10 (2) CPU instruction set: x 64 (3) softwa ...

  9. 算法:详解布隆过滤器的原理、使用场景和注意事项@知乎.Young Chen

    算法:详解布隆过滤器的原理.使用场景和注意事项@知乎.Young Chen 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data struc ...

最新文章

  1. Pytest - 使用介绍
  2. 深入理解 KVC\KVO 实现机制 — KVC
  3. rnn神经网络模型_一文读懂序列建模(deeplearning.ai)之循环神经网络(RNNs)
  4. potplayer 多个进程_操作系统 | 进程同步与进程互斥
  5. 大型网站首页执行时间0.3秒,性能算好还是算坏?
  6. Python(8)_初学Python
  7. Ubuntu18.04解决sudo执行慢的问题
  8. Python--day46--mysql触发器
  9. 跟我学Spring Cloud(Finchley版)-21-Spring Cloud Config-配置属性加解密
  10. asp.net 页面引入外部JS 在IE6下延迟加载报错,IE7+均没问题
  11. SharePoint 站点集和子站点数据互相读取
  12. 64位计算机安装xp,xp系统一键安装64位win7
  13. 如何卸载当前最新版的奇某信天擎?
  14. 输入scor为80结果实验
  15. RabbitMQ-基础(二)
  16. 软考数据库考试有题库吗_科目一考试的题目都是从题库里挑的吗?科一考试技巧分享!...
  17. 怎么调整图片dpi大小?如何修改分辨率?
  18. DC-DC与LDO的区别
  19. SCORM 基础知识
  20. 佳能eosr控制环能否计算机控制,EOS R有哪些隐藏功能

热门文章

  1. 计算机云服务论文,云计算机教学平台探讨论文
  2. java jpa自身关联查询_使用JPA进行数据查询和关联查询
  3. automake生成静态库文件_Automake 详解
  4. 怎么找到手机录音机里的文件
  5. 如何将pdf文件的英文翻译成中文
  6. 考研计算机网络安全专业,北京交通大学计算机考研分数,网络安全专业
  7. windows开启ssh服务教程及常见问题
  8. Touch driver porting
  9. 利用PYTHON将netcdf(.nc)格式数据转换成JSON GeoJSON
  10. Flask部署 —— nginx+gunicorn+supervisor