数组定义方法

数组定义方法 

"abcdef"                               一个字符串
"a" "b" "c" "d" "e" "f"                字符串列表
("a" "b" "c" "d" "e" "f")              数组
(10 20 30 40 50 60)
  0  1  2  3  4  5    元素的下标

数组的元素可使用的数据类型:数值 或 "字符串" '字符串'


定义数组

数组名=(元素1 元素2 元素3 ....)

数组名[0]=元素1
数组名[1]=元素2
数组名[2]=元素3
....

list="元素1 元素2 元素3 ...."
数组名=($list)

[root@l1 ~]# sz=(aa bb cc dd)
[root@l1 ~]# echo ${sz[@]}
aa bb cc dd
[root@l1 ~]# 
[root@l1 ~]# echo ${sz[@]}
aa bb cc dd
[root@l1 ~]# echo ${!sz[@]}
0 1 2 3
[root@l1 ~]# sz[0]=a
[root@l1 ~]# echo ${sz[@]}
a bb cc dd
[root@l1 ~]# 
[root@l1 ~]# sz[1]=b
[root@l1 ~]# sz[2]=c
[root@l1 ~]# echo ${sz[@]}
a b c dd
[root@l1 ~]# 
[r[root@l1 ~]# list="11 22 33 44 55"
[root@l1 ~]# sz2=($list)
[root@l1 ~]# echo ${#sz2[@]}
5
[root@l1 ~]# echo ${sz2[@]}
11 22 33 44 55
[root@l1 ~]# 
[root@l1 ~]# sz2=([0]="a" [1]="b" [2]="c")
[root@l1 ~]# echo ${sz2[@]}
a b c
[root@l1 ~]# 


查看数组的元素列表

echo ${数组名[@]}
echo ${数组名[*]}

[root@l1 ~]# list="11 22 33 44 55"
[root@l1 ~]# sz2=($list)[root@l1 ~]# echo ${sz2[@]}
11 22 33 44 55
[root@l1 ~]# echo ${sz2[*]}
11 22 33 44 55
[root@l1 ~]# 


查看数组的长度(元素的个数)

echo ${#数组名[@]}
echo ${#数组名[*]}

[root@l1 ~]# echo ${sz2[@]}
11 22 33 44 55
[root@l1 ~]# echo ${#sz2[@]}
5
[root@l1 ~]# echo ${#sz2[*]}
5
[root@l1 ~]# 


查看数组的元素下标

echo ${!数组名[@]}
echo ${!数组名[*]}

[root@l1 ~]# echo ${sz2[@]}
11 22 33 44 55
[root@l1 ~]# echo ${!sz2[@]}
0 1 2 3 4
[root@l1 ~]# echo ${!sz2[*]}
0 1 2 3 4
[root@l1 ~]# 


查看某个下标的元素值

echo ${数组名[下标]}

[root@l1 ~]# echo ${sz2[@]}
11 22 33 44 55
[root@l1 ~]# echo ${!sz2[@]}
0 1 2 3 4
[root@l1 ~]# echo ${sz2[0]}
11
[root@l1 ~]# echo ${sz2[2]}
33
[root@l1 ~]# 


数组分片

echo ${数组名[@]:下标:长度}
echo ${数组名[*]:下标:长度}

[root@l1 ~]# echo ${sz[@]}
11 22 33 44 55 66
[root@l1 ~]# echo ${!sz[@]}
0 1 2 3 4 5
[root@l1 ~]# echo ${sz[@]:2:2}
33 44
[root@l1 ~]# echo ${sz[@]:1:4}
22 33 44 55
[root@l1 ~]# 
[root@l1 ~]# echo ${sz[*]:1:4}
22 33 44 55
[root@l1 ~]# echo ${sz[*]:1:3}
22 33 44
[root@l1 ~]# echo ${sz[*]:2:3}
33 44 55
[root@l1 ~]# 


数组字符替换

echo ${数组名[@]/旧字符/新字符}
数组名=(${数组名[*]/旧字符/新字符})      #通过重新定义的方式实现永久替换

[root@l1 ~]# echo ${sz[@]}
11 22 33 44 55 66
[root@l1 ~]# echo ${sz[@]/11/aa}
aa 22 33 44 55 66
[root@l1 ~]# echo ${sz[@]/22/b}
11 b 33 44 55 66
[root@l1 ~]# 

[root@l1 ~]# sz=(${sz[*]/22/bb})
[root@l1 ~]# echo ${sz[@]}
11 bb 33 44 55 66
[root@l1 ~]# 


数组删除

unset 数组名[下标]      #删除数组的某个下标
unset 数组名            #删除数组

[root@l1 ~]# unset sz[1]
[root@l1 ~]# echo ${sz[*]}
11 33 44 55 66
[root@l1 ~]# echo ${#sz[*]}
5
[root@l1 ~]# echo ${!sz[*]}
0 2 3 4 5
[root@l1 ~]# 

[root@l1 ~]# echo ${sz[@]}
11 33 44 55 66
[root@l1 ~]# unset sz
[root@l1 ~]# echo ${sz[@]}[root@l1 ~]# 

 


数组遍历和重新定义

arr=(1 2 3 4 5)
n=0
for i in ${arr[@]}
do
    arr[$n]=$[i*2]
    let n++
done

#!/bin/bash
test1() {#echo "函数接收到的参数列表:$@"arr2=($@)#n=0#for i in ${arr2[@]}#do#    arr2[$n]=$[$i * 2]#    let n++#donefor ((i=0; i<${#arr2[@]}; i++))doarr2[$i]=$[${arr2[$i]} * 2]doneecho ${arr2[@]}
}arr1=(11 22 33 44 55 66)result=$(test1 ${arr1[@]})arr1=($result)echo "arr1 double以后的值为 ${arr1[@]}"


数组追加元素

数组名[新下标]=新元素

数组名[数组长度]=新元素        #仅适用于完整的数组

数组名+=(新元素1 新元素2 ....)

数组名=("${数组名[@]}" 新元素1 新元素2 ....)


向函数传数组参数

函数名() {
     数组2=($@)         #在函数体内将传入的列表重新组成数组
     ....
}

函数名 ${数组1[@]}      #在函数体外将数组分解成列表传入

函数接收到的参数列表 

#!/bin/bash
test1() {#echo "函数接收到的参数列表:$@"arr2=($@)#n=0#for i in ${arr2[@]}#do#    arr2[$n]=$[$i * 2]#    let n++#donefor ((i=0; i<${#arr2[@]}; i++))doarr2[$i]=$[${arr2[$i]} * 2]doneecho ${arr2[@]}
}arr1=(11 22 33 44 55 66)result=$(test1 ${arr1[@]})arr1=($result)echo "arr1 double以后的值为 ${arr1[@]}"


从函数返回数组

函数名(){
    ....
    echo ${数组2[@]}     #在函数体内以列表形式返回值
}

数组1=(函数名 参数)      #在函数体外将函数执行的结果重新组合成数组

根据下标判断数组是否完整 

#!/bin/bash
#根据下标判断数组是否完整test1() {#将传入的列表重新组成数组arr=($@)#获取数组长度length=${#arr[@]}#获取长度n - 1 的下标xiabiao=$[length - 1]echo $xiabiao
}array=(10 20 30 40 50 60)result=$(test1 ${array[@]})#获取当前数组最后一个元素下标
xiabiao_now=$(echo ${!array[@]} | awk '{print $NF}')
#判断以上两个下标是否相同
if [ $result -eq $xiabiao_now ];thenecho "数组完整"
elseecho "数组不完整"
fiarray1=(10 20 30 40 50 60)
array3=([0]="a" [1]="b" [2]="c" [3]="d" [5]="f")

 

#!/bin/bash
#判断数组是否完整
array1=(10 20 30 40 50 60)
array3=([0]="a" [1]="b" [2]="c" [3]="d" [5]="f")length1=${#array1[@]}
length3=${#array3[@]}last1=$[length1 - 1]
last3=$[length3 - 1]arr1_last=${array1[$last1]}
arr3_last=${array3[$last3]}ARR1_LAST=$(echo ${array1[@]} | awk '{print $NF}')
ARR3_LAST=$(echo ${array3[@]} | awk '{print $NF}')if [ "$arr1_last" == "$ARR1_LAST" ];thenecho "array1 为完整的数组"
elseecho "array1 数组不完整"
fiif [ "$arr3_last" == "$ARR3_LAST" ];thenecho "array3 为完整的数组"
elseecho "array3 数组不完整"
fi

数组排序算法:

冒泡排序

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

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

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

 

#!/bin/bash
#冒泡排序算法maopao() {
arr=($@)
#获取数组长度
length=${#arr[@]}#外循环确定比较轮数,比较轮数为数组长度减1,从1开始
for ((a=1; a<length; a++))
do#内循环来比较相邻两个元素,从小到大排序:较大的往后放,每轮的比较次数随着轮数增加而减少for ((b=0; b<length-a; b++))   #以左边元素的下标为参照do#获取左边比较元素的值left=${arr[$b]}#获取右边比较元素的值c=$[b + 1]right=${arr[$c]}#比较相邻两个元素,如果左边的元素值大于右边的,则元素互换if [ $left -gt $right ];thentmp=$left#将原来右边元素的值定义到左边元素arr[$b]=$right#将原来左边元素的值定义到右边元素arr[$c]=$tmpfidone
doneecho "排序后数组顺序为 ${arr[@]}"
}read -p "请输入一个数组列表:" num
array=($num)
echo "原始数组的顺序为 ${array[@]}"maopao ${array[@]}

直接选择排序

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

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

#!/bin/bash
#直接选择排序
choose() {
arr=($@)
length=${#arr[@]}
#外循环 确定排序轮数,轮数为数组长度减1
for ((a=1; a<length; a++))
do#定义初始最大元素的下标为0max=0#内循环 确定当前比较轮数中最大的元素下标for ((b=1; b<=length-a; b++))   #设置作为与初始最大元素比较的元素下标范围do#通过比较获取最大元素的下标if [ ${arr[$b]} -gt ${arr[$max]} ];thenmax=$bfidone#用当前轮数最大的元素与当前轮数最后一个元素交换位置last=$[length - a]tmp=${arr[$last]}arr[$last]=${arr[$max]}arr[$max]=$tmp
doneecho "排序后的数组顺序为 ${arr[@]}"}read -p "请输入一个数组列表:" num
array=($num)
echo "原始数组的顺序为 ${array[@]}"choose ${array[@]}

 

反转排序


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

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

#!/bin/bash
#反转排序
filp() {
array=($@)
length=${#array[@]}for ((a=0; a<length/2; a++))
dotmp=${array[$a]}#获取每轮的最后一个元素的下标last=$[length-1-a]array[$a]=${array[$last]}array[$last]=$tmpdoneecho "反转排序后的数组顺序为 ${array[@]}"
}read -p "输入一个数组的列表:" num
arr=($num)
echo "原始数组的顺序为 ${arr[@]}"filp ${arr[@]}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/701705.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学建模——线性回归模型

目录 1.线性回归模型的具体步骤和要点&#xff1a; 1.收集数据&#xff1a; 2.探索性数据分析&#xff1a; 3.选择模型&#xff1a; 4.拟合模型&#xff1a; 5.评估模型&#xff1a; 1.R平方&#xff08;R-squared&#xff09;&#xff1a; 2.调整R平方&#xff08;Ad…

第三方组件element-ui

1、创建 选vue2 不要快照 vue2于vue3差异 vue2main。js import Vue from vue import App from ./App.vueVue.config.productionTip falsenew Vue({render: h > h(App), }).$mount(#app)vue3 main.js vue2不能有多个跟组件&#xff08;div&#xff09; 代码&#xff1a;Mo…

交互原型设计工具 Axure RP 9 for Mac 正式激活版

Axure RP 9 Pro Mac版是Mac平台上的一款专为快速原型设计而生的应用&#xff0c;Axure RP 9 Pro Mac版可以辅助产品经理快速设计完整的产品原型&#xff0c;并结合批注&#xff0c;说明以及流程图&#xff0c;框架图等元素&#xff0c;将产品完整地表述给各方面设计人员&#x…

多格式兼容的在线原型查看:Axure RP的便捷解决方案

Axure rp不仅可以绘制详细的产品构思&#xff0c;还可以在浏览器中生成html页面&#xff0c;但需要安装插件才能打开。安装Axure后 rpchrome插件后&#xff0c;还需要在扩展程序中选择“允许访问文件网站”&#xff0c;否则无法在Axure中成功选择 rp在线查看原型。听起来很麻烦…

RS编码和卷积码总结

RS编码 简要介绍RS编码及其原理 1. RS编码简介 Reed-Solomon编码&#xff08;RS编码&#xff09;是一种强大的纠错码&#xff0c;广泛应用于数据存储和传输中。RS编码由Irving S. Reed和Gustave Solomon于1960年提出&#xff0c;属于BCH码的一种&#xff0c;是基于有限域&am…

深⼊理解指针(5)

目录 1. 回调函数是什么&#xff1f;1.1 使用回调函数修改 2. qsort使⽤举例2.1 使⽤qsort函数排序整型数2.2 使⽤qsort排序结构数据按年龄排序2.3 使⽤qsort排序结构数据按名字排序2.4整体代码 3. qsort函数的模拟实现3.1 整型数组的实现3.2 结构体按名字排序实现3.3 结构体按…

49.乐理基础-拍号的类型-单拍子、复拍子

当前写的东西&#xff0c;如果只是想要看懂乐谱的话&#xff0c;它是没什么意义的&#xff0c;就像我们要把 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5。。。称为自然数&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5称为正整…

02-WPF_基础(二)

3、控件学习 控件学习 布局控件&#xff1a; panel、Grid 内容空间&#xff1a;Context 之恶能容纳一个控件或布局控件 代表提内容控件&#xff1a;内容控件可以设置标题 Header 父类&#xff1a;HeaderContextControl。 条目控件&#xff1a;可以显示一列数据&#xf…

算法训练营第二十八天 | LeetCode 77 组合(剪枝优化)、LeetCode 216 组合总和III、LeetCode 17 电话号码的字母组合

LeetCode 77 组合&#xff08;剪枝优化&#xff09; 当我们到达某一层&#xff0c;后面的结点数已经不能满足条件时。可以进行剪枝操作。 代码如下&#xff1a; class Solution { private:vector<int> path;vector<vector<int>> res;void backtracking(in…

云商店如何让更多企业摘到技术普惠的“果实”?

文 | 智能相对论 作者 | 沈浪 现阶段&#xff0c;越是工业体系发达的地区&#xff0c;越需要加速技术普惠的步伐。比如&#xff0c;在苏州&#xff0c;华为云就在联合当地政府、企业伙伴打造以华为云云商店为重要链接的智能化商业增长底座。 华为云云商店以“电商式”的购物…

基于MSWA相继加权平均的交通流量分配算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于MSWA相继加权平均的交通流量分配算法matlab仿真.如图所示交通网络中&#xff0c;包含6个节点、11各路段、9个OD对。经枚举可得每个OD对间存在3条无折返有效路…

来学习线程啦

线程的相关概念 程序 简单点说&#xff1a;程序就是我们写的代码&#xff1b;也可以理解为&#xff1a;为完成特定任务&#xff0c;用某种语言编写的一组指令的集合 进程 进程是指运行中的程序。 比如&#xff1a;我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系…