シェル配列とソートアルゴリズム(バブルソートアルゴリズム、直接選択ソート、逆ソート)

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[@]}

おすすめ

転載: blog.csdn.net/weixin_53567573/article/details/114677031