配列と並べ替えのアルゴリズム
1.配列定義方法
要素値:(30 20 10 60 50 40)
インデックス:0 1 2 3 4 5
4つの方法
1.1。方法1
配列名=(value0 value1 value2…)
2.2。方法2
配列名=([0] =値[1] =値[2] =値…)
3.3。方法3
リスト名= "value0 value1value2…"
配列名=($リスト名)
4.4。方法4
配列名[0] = "値"
配列名[1] = "値"
配列名[2] = "値"
2つ目は、配列に含まれるデータ型です。
- 数值类型
- 字符类型(字符串):使用" "或' '定义,防止元素当中有空格,元素按空格分割
3つ目は、配列の長さを取得し、データリストを取得することです。
配列の長さを取得します
array=(1 2 3 4 5 6 7 8) ///定义数组
echo ${#array[*]}或者 echo ${#array[@]} ///获取数组长度
データリストを取得する
echo ${array[*]}或者 echo ${array[@]}///区别@加引号时数据每个是单个主体 *号是一个整体
インデックスの割り当てを読む
echo ${array[索引号]}
4、配列走査
#!/bin/bash
arr1=(1 2 3 4 5)
for i in ${arr1[@]}
do
echo $i
done
5、アレイスライシング
array=(1 2 3 4 5 6)
echo ${array[@]} ///输出整个数组,此处*与@相同
echo ${array[@]:0:2} ///获取 ${数组名[@或*]:起始位置:长度} 的值
echo ${array[*]:1:3}
echo ${array[*]:2:3}
6、アレイの交換
方法1:単一の交換
array=(1 2 3 4 5 6)
echo ${array[@]}
array[0]=66
echo ${array[@]}
方法2:複数の置換の一時的な置換(元のアレイのデータは変更されません)
array=(1 2 3 4 5)
echo ${array[@]/4/66} ///$(数组名[@或*]/查找字符(替换字符)
echo ${
array[@]} ///并会替换数组原有的数据
array=($array[@]/4/66)
echo ${array[@]}
5、アレイの削除
array=(1 2 3 4 5 6)
unset array #删除数组
echo ${array[@]}
array=(1 2 3 4 5 6)
unset array[2] #删除第三个元素
echo ${array[*]}
6、配列に要素を追加します
方法1:
array=(1 2 3 4 5 6)
array[6]=7 ///在最后一个索引号添加比最后一个索引大的索引 在加上元素
array[7]=80
方法2:
array[${#array[@]}]=7 ///根据数组长度添加索引添加元素,如果数组索引不是连续的则无法生效
方法3:
array=("${array[@]}" 1 2 3 4 5)
二重引用符は省略できません。省略しないと、配列にスペースを含む要素がある場合、要素はスペースによって複数の部分に分割されます。「@」を「」に置き換えることはできません。「」に置き換えると、 「@」と結合されます。「」は同じように動作します。二重引用符を追加すると、配列内のすべての要素が要素として配列に追加されます。
for i in "${array[@]}"; do echo $i; done
方法4:
array+=(10 20 30...)
#带添加元素必须使用()包围起来,并且多个元素用空格分割
7つ目は、配列パラメーターを関数に渡します
配列変数が関数パラメーターとして使用されている場合、関数は配列変数の最初の値のみを取ります
#/bin/bash
test1() {
echo "接收到的数据为:$@"
newarr=($1)
echo "新数组的数据:${newarr[*]}"
}
arr=(1 2 3 4 5 6)
echo "arr数组的数据: ${arr[*]}"
test1 $arr
この問題を解決するには、配列変数の値を個々の値に分解してから、これらの値を関数パラメーターとして使用する必要があります。関数内で、すべてのパラメーターを新しい配列変数に再結合します
#/bin/bash
test2() {
echo "接收到的数据为:$@"
newarr=($@)
echo "新数组的数据:${newarr[*]}"
}
arr=(1 2 3 4 5 6)
echo "arr数组的数据: ${arr[*]}"
test2 ${arr[@]}
8つ目は、関数がパラメーターを配列に渡すことです。
例1:
#/bin/bash
test3() {
newarray=($@)
sum=0
for i in ${newarray[@]}
do
sum=$[$sum+$i]
done
echo $sum
}
array=(1 2 3 4 5 6)
echo "初始array数组的值 ${array[@]}"
result=`test3 ${
array[@]}`
echo "数组的和 $result"
例2
#/bin/bash
test(){
newarray=($@)
for ((i=0; i<${#newarray[@]}; i++))
do
newarray[$i]=$[${newarray[$i]} * 2]
done
echo ${newarray[@]}
}
array=(1 2 3 4 5 6)
echo "初始数组数据 ${array[@]}"
result=(`test ${
array[@]}`)
echo "新数组 ${result[@]}"
9つの配列ソートアルゴリズム
(1)バブルソートアルゴリズム
バブルの急増と同様に、データは配列内で小さいものから大きいものへ、または大きいものから小さいものへと前進し続けます。
2.基本的な考え方:バブルソートの基本的な考え方は、隣接する2つの要素の値を比較し、条件が満たされた場合に要素の値を交換し、小さい方の要素を配列の前に移動して、移動することです。大きい方の要素を配列の後ろに配置して(つまり、2つの要素の位置を入れ替えて)、小さい方の要素がバブルのように下から上に上がるようにします。
3.アルゴリズムのアイデア:バブリングアルゴリズムは、二重ループによって実装されます。このループでは、配列要素が1つしかないため、外側のループを使用して、並べ替えの回数、通常は並べ替える配列の長さから1回を引いた数を制御します。最後のループに残され、比較は必要ありません。同時に、配列はソートされています。内側のループは主に、配列内の隣接する各要素のサイズを比較して、位置を交換するかどうかを決定するために使用されます。比較と交換の数は、ソートラウンドの数とともに減少します。
#!/bin/bash
read -p "输入需要排序的数组:" x
array=($x)
echo "旧数组为:${array[@]}"
#获取数组长度
length=${#array[@]}
for ((i=1;i<$length;i++))
do
#确定数值位置,大的往后放,并且比较次数随着轮数增加而减少
for ((a=0;a<$length-$i;a++))
do
#定义第一个和第二个比较的数值
first=${array[$a]}
second=${array[$a+1]}
if [ $first -gt $second ];then
#把第一个数值赋予给一个临时变量temp
temp=${array[$a]}
#把第二个数值赋予给第一个数值
array[$a]=${array[$a+1]}
#再把第一个数值的值(临时变量temp)赋予给第二个数值
array[$a+1]=$temp
fi
done
done
echo "排序后的数组顺序为:${array[@]}"
(2)直接選択して並べ替える
1.直接選択ソート
バブルソートと比較して、直接選択ソートは交換が少ないため、高速です。
2.基本的な考え方:指定した並べ替え位置を他の配列要素とそれぞれ比較します。条件が満たされると、要素の値が交換されます。バブルソートの違いは、隣接する要素を交換することではなく、一致する要素を交換することです。指定された並べ替え位置の条件(たとえば、最後の要素から並べ替えを開始)。これにより、並べ替え位置が徐々に拡大し、最終的に配列全体が並べ替え形式になります。
#!/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)反転表示
1.元の配列の内容を逆の順序で並べ替えます
。2。基本的な考え方:
配列の最後の要素を最初の要素に置き換えます。最後から2番目の要素は2番目の要素に置き換えられ、以下同様に、すべての配列要素が逆になって置き換えられます。
#!/bin/bash
arr=(1 2 3 4 5)
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[@]}