数组排序
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