Matriz shell e algoritmo de classificação
- Um, a matriz
- Em segundo lugar, o algoritmo de classificação
Um, a matriz
1. Método de definição de matriz
(30 20 10 60 50 40)
0 1 2 3 4 5
① Método um
数组名=(value0 value1 value2 ...)
② Método dois
数组名=([0]=value [1]=value [2]=value ...)
③ Método Três
列表名="value0 value1 value2 ..."
数组名=($列表名)
④ Método 4
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
2. Tipos de dados incluídos na matriz
- 数值类型
- 字符类型
使用" "或' '定义
3. Obtenha o comprimento da matriz e a lista de dados
① Obtenha o comprimento da matriz
② Obtenha a lista de dados
③ Leia uma atribuição de índice
4. Travessia da matriz
#!/bin/bash
arr1=(100 200 300 400 500)
for i in "${arr1[@]}"
do
echo $i
done
for i in "${arr1[*]}"
do
echo $i
done
5. Fatiamento de matriz
6. Substituição da matriz
7. Array delete
8. Adicione elementos à matriz
①
array=(1 2 3 4 5 6)
array[6]=7
array[7]=20
②
array[${#array[@]}]=7
③
array=("${array[@]}" 1 2 3 4)
④
array+=(10 20 30...)
9. Passe parâmetros de matriz para a função
#!/bin/bash
test1() {
echo "接收到的数据为:$@"
newarr=($@)
echo "新数组的数据:${newarr[*]}"
}
arr=(1 2 3 4 5 6)
echo "arr数组的数据: ${arr[*]}"
test1 ${arr[@]}
Em segundo lugar, o algoritmo de classificação
1. Algoritmo de bolhas
Semelhante ao surgimento de bolhas, os dados continuarão a avançar na matriz, de pequenos a grandes ou de grandes a pequenos.
- Ideia básica: a ideia básica da classificação por bolha é comparar os valores de dois elementos adjacentes, trocar os valores dos elementos se as condições forem atendidas, mover o elemento menor para a frente da matriz e mover o maior elemento para trás da matriz (ou seja, troque duas posições de Elemento) para que os elementos menores subam da parte inferior para o topo como uma bolha
- Ideia do algoritmo: o algoritmo de bolha é implementado por um loop de camada dupla, no qual o loop externo é usado para controlar o número de rodadas de classificação, geralmente o comprimento da matriz a ser classificada menos 1 vez, porque há apenas um elemento da matriz deixado no último loop, nenhuma comparação é necessária e a matriz está ao mesmo tempo. A classificação foi concluída. O loop interno é usado principalmente para comparar o tamanho de cada elemento adjacente na matriz para determinar se deve-se trocar as posições.O número de comparações e trocas diminui com o número de rodadas de classificação.
#!/bin/bash
num=(1 2 3 4 5 6 7 8 9 10)
for ((a=1; a<${#num[*]}; a++))
do
for ((a=0; a<${#num[*]}-i; a++))
do
if [ ${num[$a]} -lt ${num[$a+1]} ]
then
temp=${num[$a]}
num[$a]=${num[$a+1]}
num[$a+1]=$temp
fi
done
echo "第${i}次排序后为:${num[*]}"
done
echo "排序后的数组顺序为:${num[*]}"
2. Método de eliminação direta
Em comparação com a classificação por bolha, a classificação por seleção direta tem menos trocas, por isso é mais rápida
- Ideia básica: compare a posição de classificação especificada com outros elementos da matriz. Se a condição for atendida, o valor do elemento é trocado. Observe que a classificação por bolha é diferenciada aqui. Em vez de trocar elementos adjacentes, o elemento que atende à condição é trocado pelo posição de classificação especificada (como Classificar a partir do último elemento), para que a posição de classificação se expanda gradualmente e, finalmente, toda a matriz se torna o formato
#!/bin/bash
arr=(20 30 10 60 40 50)
echo "原数组的值为:${arr[@]}"
length=${#arr[@]}
#定义排序轮数
for ((a=1;a<$length;a++))
do
#假设索引为0的元素是最大的
index=0
#定义和第一个元素比较的索引,来确定最大的元素索引
for ((b=1;b<=$length-$a;b++))
do
#定义最大的元素的值
max=${arr[$index]}
#定义从索引1开始比较的元素的值
element=${arr[$b]}
#判断如果从索引1开始比较的元素的值大于当前最大元素的值,就记录最大值的索>引到index
if [ $element -gt $max ];then
index=$b
fi
done
#定义每一轮比较的最后一个元素的索引
last=$[$length-$a]
#把当前轮次的最后一个元素的值赋给临时变量temp
temp=${arr[$last]}
#把最大的值赋给当前轮次的最后一个元素
arr[$last]=${arr[$index]}
#把temp里的原来最后一个元素的值赋给原最大值所在索引的元素
arr[$index]=$temp
done
echo "排序后的数组为:${arr[@]}"
3. Inverta a classificação
Reordene o conteúdo da matriz original na ordem inversa
- A ideia básica:
substitua o último elemento do array pelo primeiro elemento. O penúltimo elemento é substituído pelo segundo elemento, e assim por diante, até que todos os elementos da matriz sejam revertidos e substituídos
#!/bin/bash
arr=(1 2 3 4 5 6 7)
length=${#arr[@]}
for ((i=0;i<$length/2;i++))
do
temp=${arr[$i]}
arr[$i]=${arr[$length-$i-1]}
arr[$length-$i-1]=$temp
done
echo ${arr[@]}