数组的简单命令,以及排序算法
Posted 丁CCCCC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组的简单命令,以及排序算法相关的知识,希望对你有一定的参考价值。
数组
一、数组定义
四种定义方式:
需要注意的是
- “1 2 3 4 0”是数组
- “1234”则是字符串
第一种方式
第二种方式
第三种方式
第四种方式
二、数据类型
共有两类
- 数值类型
- 字符类型
使用 " " 或 ’ ’ 定义
三、数组的几个简单命令
3.1、获取数组长度
命令
num=(1 2 3 4 5 6 7 8)
length=${#num[*]}
echo $length
8
length=${#num[@]} # 中间换成@一样能实现功能
示意图
3.2 获取数据列表
命令
num=(1 2 3 4 5 6 7 8)
echo ${num[*]}
1 2 3 4 5 6 7 8
echo ${num[@]} # @功能一样
示意图
3.3 获取某下标赋值
下标赋值的第一位是0,0 1 2 3…依次延续下去
命令
num=(1 2 3 4 5 6 7 8)
index3=${num[3]}
echo $index3
4
示意图
3.4 数组遍历
命令
[root@ccc lianxi]# num=(1 2 3 4 5 6 7 8)
[root@ccc lianxi]# for i in ${num[@]} # *号功能一样
> do
> echo $i
> done
1
2
3
4
5
6
7
8
示意图
3.5 数组切片
命令
num=(1 2 3 4 5 6 7 8)
echo ${num[@]} # 输出数组
1 2 3 4 5 6 7 8
echo ${num[@]:0:3} # 数组名[@或*]:起始:所需长度
1 2 3
echo ${num[*]:2:5}
3 4 5 6 7
echo ${num[@]:2:3}
3 4 5
示意图
3.6 数据替换
命令
num=(1 2 3 4 5 6 7 8)
echo ${num[@]/3/777} # 将3替换为777
1 2 777 4 5 6 7 8
echo ${num[@]} # 替换只是临时性,再次查看就没有了,要改变需重新赋值
1 2 3 4 5 6 7 8
示意图
3.7 数组删除
命令
num=(1 2 3 4 5 6 7 8)
echo ${num[*]}
1 2 3 4 5 6 7 8
unset num # 数组删除命令
echo ${num[*]}
示意图
四、数组追加
4.1 第一种
命令
num=(1 2 3 4 5 6 7 8)
echo ${num[*]}
1 2 3 4 5 6 7 8
num[3]=666 # 根据相应的下标替换输入的值
echo ${num[*]}
1 2 3 666 5 6 7 8
示意图
4.2 第二种
命令
num=(1 2 3 4 5 6 7 8)
echo ${num[*]}
1 2 3 4 5 6 7 8
num[${#num[@]}]=777 # 追加到最后一位
echo ${num[*]}
1 2 3 4 5 6 7 8 777
4.3 第三种
命令
num=(1 2 3 4 5 6 7 8)
num=("${num[@]}" 11 22 33 44) # 批量添加,@不能更换为*
echo ${num[*]}
1 2 3 4 5 6 7 8 11 22 33 44
双引号不能忽略,否则当num中有空格时会按照空格将元素拆分多个
示意图
4.4 第四种
命令
num=(1 2 3 4 5 6 7 8)
num+=(aa bb cc dd) # 更简单的批量添加
echo ${num[*]}
1 2 3 4 5 6 7 8 aa bb cc dd
示意图
五、向函数传数组参数
如果将数组变量作为函数参数,函数则只会取数值变量的第一个值:
cc1 () {
echo "接收到的参数列表:$@"
newarrary=($@)
echo "新数组的值为:${newarrary[*]}"
}
array=(2 5 1 4 3)
echo "原数组的值:${array[*]}"
cc1 $array
解决这个问题需要将组变量分解成单个的值,然后将这些值作为函数参数使用,在函数内部,在将所有的参数重新组合成新的数组变量
cc2 () {
newarrary=($(echo $@)) # 定义新数组,元素为全部参数
echo "新数组的值:${newarrary[*]}"
}
array=(2 5 1 4 3)
echo "原始数组的值:${array[*]}"
cc2 ${array[*]}
六、从函数中返回数组
cc1() { # 求和
newarrary=(`echo $@`)
sum=0
for i in ${newarrary[*]}
do
sum=$[$sum + $i]
done
echo $sum
}
cc2 () { # 两倍值
newarrary=(`echo $@`)
for ((i=0; i<=$[$# - 1]; i++))
{
newarrary[$i]=$[${newarrary[$i]} * 2]
}
echo ${newarrary[*]}
}
array=(3 5 1 2 4)
echo "原始数组的值:${array[*]}"
result1=`cc1 ${array[*]}`
echo "新数组的和:$result1"
result2=(`cc2 ${array[*]}`)
echo "新数组的值:${result2[*]}"
七、数组排序算法
7.1 冒泡排序
会将数据在数组中从小到大或者从大到小向前移动
基本思想
冒泡排序的基本思想是相邻的两个元素值,如果这连个值满足条件就交换元素值,把小的那一方移动到数组前面,大的移动到数组后面(也就是交换两个元素的位置),这样小的元素就像气泡一样从底部上升到顶部
算法思路
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少
模板
命令
#定义一个初始数组
read -p "请输入一个随机数组列表" list
arr=($list)
echo "原数组的顺序为:${arr[@]}"
length=${#arr[@]} #获取数组长度
for ((i=1; i<$length; i++)) #定义比较轮数,为数组长度减一,并且从1开始
do
#确定每次比较的元素下标,比较相邻的两个元素,大的放后面
for((j=0; j<$length-$i; j++)) #每轮比较的次数随着轮数递减
do
first=${arr[$j]} #获取第一个元素的值
k=$[$j + 1] #获取第二个元素的值
second=${arr[$k]}
#比较第一个元素和第二个元素的值,如果1大于2,两个元素交换位置
if [ $first -gt $second ];then
temp=${arr[$j]} #把第一个元素的值保存在临时变量temp中
arr[$j]=$second #把第二个元素的值赋给第一个元素
arr[$k]=$temp #把原来第一个元素的值赋给第二个元素
fi
done
done
echo "排序号新的数组的顺序为:${arr[@]}"
示意图
7.2 直接选择排序
与冒泡排序不同,直接排序的交换次数更少,对等的速度就会更快
基本思想
- 指定排序位置与其它数组元素分别对比,满足条件的就交换元素值
- 和冒泡排序不同,不是交换相邻的元素,而是把满足条件的元素与指定的排序位置交换( 从最后一个元素开始排序)
- 这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式
模板
命令
cc=(11 24 7 51 35)
length=${#cc[*]}
for ((i=1; i<$length; i++)) # 定义排序轮数
do
index=0
for ((j=1; j<=$length-$i; j++)) # 确定用于比较的第一个元素的索引范围
do
if [ ${cc[$j]} -gt ${cc[$index]} ];then # 通过比较来获取最大元素的索引位置
index=$j
fi
done
last=$[$length - $i] # 获取每轮最后一个元素的索引
temp=${cc[$last]} # 把当前轮次的最后一个元素的值保存在临时变量中
cc[$last]=${cc[$index]} # 把最大的元素值赋予最后一个元素
cc[$index]=$temp # 原最后一个元素的值赋予给原最大位置的元素
done
echo "重新排序后的数:${cc[*]}"
示意图
7.3 反转排序
顾名思义,用相反的顺序把原来的数组重新排序
基本思想
把数组最后一个元素和第一个对调,倒数第二个和正数第二个对调,以此类推完成所有的反转
模板
命令
cc=(10 20 30 40 50 60)
length=${#cc[*]}
for ((i=0; i<$length/2; i++))
do
temp=${cc[$i]}
cc[$i]=${cc[$length-$i-1]}
cc[$length-$i-1]=$temp
done
echo ${cc[*]}
示意图
7.4 希尔排序
命令
num=(5 7 3 1 2 8 6 4)
length=${#num[*]}
# 把距离为gap的元素编到一个组,扫描所有组,每次扫描减少增量
for ((gap=$length/2; gap>0; gap/=2))
do
for ((i=gap; i<$length; i++))
do
temp=${num[$i]}
# 对距离为gap的元素组排列,每一轮比较拿当前轮次最后一个元素与组内其他元素比较,将数组大的往后放
for ((j=i-gap; j>=0&&temp<${num[$j]}; j-=gap))
do
num[$j+$gap]=${num[$j]}
done
# 和最左边较大的元素对调位置
num[$j+$gap]=$temp
done
done
echo ${num[*]}
示意图
以上是关于数组的简单命令,以及排序算法的主要内容,如果未能解决你的问题,请参考以下文章