[转帖]Shell脚本数组(实现冒泡排序,直接选择排序,反转排序)
目录
数组
- 数组中可以存放多个值(bash 只支持一维数组)
- 数组元素的索引从0开始
- 数组在括号内指定数组的值,每个值仅能用空格分割

其中:
30为索引0
20为索引1
10为索引2
60为索引3
以此类推,不过注意索引是从0开始的
如果数组中有三个参数:1 2 3
运行数组脚本后
"$*" 为 “1 2 3” (作为一个整体使用)
"$@" 为“1” “2” “3” (分别作为单个的个体使用)
"$#" 为3 (表示参数的数量,也可以叫做长度)
不加双引号时与"@"的表现一致,加双引号时,会将数组arr1中的所有元素作为一个元素添加到数组中。
可以简单的理解为:用*号是作为一个整体,而用@还是单个的个体。
\(*</span>、<span class="token variable">\)@不加双引号时表现一致;加双引号时,$*会将所有参数作为一个整体。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
数组定义方法
方法一:
数组名=(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[*]}" #输出排序后的数组
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21


直接选择排序
与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些。
基本思想:
将指定排序位置与其它数组元素分别对比,
如果满足条件就交换元素值,注意这里区别冒泡排序,
不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换
(如从最后一个元素开始排序) ,
这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。
#!/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<span class="token operator">-</span>i<span class="token punctuation">;</span>k<span class="token operator">++</span><span class="token punctuation">))</span></span> <span class="token comment">#这里是确定用于比较的第一个元素的索引范围,比如已经定义了从索引0开始了,所以和0进行比较的范围就是从索引1-5了</span>
<span class="token keyword">do</span>
<span class="token assign-left variable">first</span><span class="token operator">=</span><span class="token variable">\){abc[\(k<span class="token punctuation">]</span>}</span> <span class="token comment">#定义与index相比较的索引的取值为first</span>
<span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">\)first -gt \({abc<span class="token punctuation">[</span>\)index]} ] #通过将index所在的索引的值与k所在的索引的值进行比较,获取最大元素的索引位置
then
index=\(k</span>
<span class="token comment">#通过比较将较大的数定义到index中,进行下一轮的比较</span>
<span class="token keyword">fi</span>
<span class="token assign-left variable">last</span><span class="token operator">=</span>\)[\(length</span>-<span class="token variable">\)i] #获取在比较的范围中的最后一个元素的索引
temp=\({abc<span class="token punctuation">[</span>\)last]} #将上一步获取到的最后一个元素的索引的值保存到临时变量temp中
abc[\(last</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token variable">\){abc[\(index<span class="token punctuation">]</span>}</span> <span class="token comment">#把最大上面for循环比较出来的最大元素的值赋值给最后一个元素</span>
abc<span class="token punctuation">[</span><span class="token variable">\)index]=$temp #把原来最后一个元素的值赋给原来最大值的位置的元素
done
done echo "排序后数组的排列顺序为${abc[*]}" #输出排序后的数组
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26


反转排序
以相反的顺序把原有数组的内容重新排序。
基本思想:
把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换。
#!/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[*]}"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12


[转帖]Shell脚本数组(实现冒泡排序,直接选择排序,反转排序)的更多相关文章
- shell脚本-数组
shell脚本-数组 数组 变量:存储单个元素的内存空间. 数组:存储多个元素的连续的内存空间,相当于多个变量的集合. 数组索引:编号从0开始,属于数值索引.索引可支持使用自定义的格式,而不仅是数值格 ...
- [转帖]Shell脚本中的break continue exit return
Shell脚本中的break continue exit return 转自:http://www.cnblogs.com/guosj/p/4571239.html break结束并退出循环 cont ...
- shell脚本——数组
连续的变量 解决:变量过多的问题,在同一类变量中,不需要定义多个名字,而是以数组的方式来定义 定义数组: declare -I 定义整数 declare -a 定义数组 declare -A 定义嵌套 ...
- 【shell脚本】将三个数字进行升序排序===numSort.sh
从命令输入三个数字进行升序排序(冒泡排序) 原理:比较两个相邻的元素,将值大的元素交换至右端. 脚本内容: [root@VM_0_10_centos shellScript]# cat numSort ...
- linux shell 脚本攻略学习8---md5校验,sort排序,uniq命令详解
一.校验与核实 目前最为出名的校验技术是md5sum和sha1sum,它们对文件内容使用相应的算法来生成校验和. 举例: amosli@amosli-pc:~/learn$ md5sum text.t ...
- shell脚本,按字母出现频率降序排序。
[root@localhost oldboy]# cat file the squid project provides a number of resources toassist users de ...
- shell脚本,按单词出现频率降序排序。
[root@localhost oldboy]# cat file the squid project provides a number of resources toassist users de ...
- Shell 编程 数组
本篇主要写一些shell脚本数组的使用. 数组定义 数组名=(value0 value1 vlaue2 ...) 数组名=([0]=value [1]=value [2]=vlaue ...) 列表名 ...
- 基于数组的shell脚本编写
基于数组的shell脚本编写 2017年08月17日 22:56:36 momokuku123 阅读数:369 数据:变量,文件,数组 变量:存储单个元素的内存中的一块存储空间 数组:存储多个元素的内 ...
- 如何在linux Shell脚本里面把一个数组传递到awk内部进行处理
前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法.前两天在QQ群里讨论awk的时候,无意间又聊起这个话题.机缘巧合之下找到一个思路,特此分 ...
随机推荐
- Nacos 本地单机版部署步骤和使用
本系列是 Spring Cloud 微服务实战系列教程.之前在 <Spring Cloud Eureka 入门 (一)服务注册中心详解> 聊过 Spring Cloud Eureka.那今 ...
- 如何使用mock应对测试所需随机数据
摘要:在做接口测试的时候,有的接口需要进行大量的数据进行测试,还不能是重复的数据,这个时候就需要随机生产数据进行测试了.这里教导大家使用mock.js生成各种随机数据. 一.什么是mock.js mo ...
- APP搜索如何又快又准?
摘要:搜索的概念深入人心,但做好一个体验绝佳的搜索服务并不是一件容易的事. 本文分享自华为云社区<云搜索服务在APP搜索场景的应用>,作者:写代码的贺大师 搜索无处不在,尤其是在移动互联的 ...
- WebKit三件套(3):WebKit之Port篇
了解其有关Port方面的设计,从而了解究竟如何能移植WebKit到自己的应用中. WebKitPort方面的内容是可以很广的,例如可将不同的图形库.网络库与WebCore集成,提供不同的Port接口供 ...
- 以平安银行“智能化银行3.0”实践,看火山引擎DataTester如何助推金融行业数智化进程
作者:DataTester 银行业正在进入一场围绕客户为中心的新革命时期.流量红利逐渐消失,银行零售进入存量客户精细化经营时代:"互联网+"给金融带来更多的场景,智能化成为零售 ...
- 火山引擎 DataTester:“在字节,A/B 实验是一种信仰”
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 进入数字经济时代,要用数据驱动业务增长已经成为各个行业的共识,但很多企业还没能真正掌握这项能力.如何最大限度转化数据价值, ...
- that the pod didn't tolerate, 2 Insufficient cpu.
K8S Pod 一直处于 Pending 状态 有几个原因可以阻止 Pod 运行,但我们将描述三个主要问题: 调度问题:无法在任何节点上调度 Pod. 镜像问题:下载容器镜像时出现问题. 依赖性问题: ...
- python WordCloud matplotlib docx 简易生成docx报告
# encode=utf-8 import numpy as np import matplotlib.pyplot as plt from docx import Document from doc ...
- HF Hub 现已加入存储区域功能
我们在 企业版 Hub 服务 方案中推出了 存储区域(Storage Regions) 功能. 通过此功能,用户能够自主决定其组织的模型和数据集的存储地点,这带来两大显著优势,接下来的内容会进行简要介 ...
- 机器学习的线性代数(Python 版)
线性代数是数学的分支学科,涉及矢量.矩阵和线性变换.它是机器学习的重要基础,从描述算法操作的符号到代码中算法的实现,都属于该学科的研究范围. 虽然线性代数是机器学习领域不可或缺的一部分,但二者的紧密关 ...
