シェル配列とソートアルゴリズム

1つは、配列です

1.配列定義方法

(30 20 10 60 50 40)
  0  1  2  3  4  5

①方法1

数组名=(value0 value1 value2 ...)

ここに画像の説明を挿入

②方法2

数组名=([0]=value [1]=value [2]=value ...)

ここに画像の説明を挿入

③方法3

列表名="value0 value1 value2 ..."
数组名=($列表名)

ここに画像の説明を挿入

④方法4

数组名[0]="value"
数组名[1]="value"
数组名[2]="value"

ここに画像の説明を挿入

2.配列に含まれるデータ型

- 数值类型
- 字符类型
  使用" "或' '定义

3.配列の長さとデータリストを取得します

①配列の長さを取得する

ここに画像の説明を挿入

②データリストを取得する

ここに画像の説明を挿入

③インデックスの割り当てを読む

ここに画像の説明を挿入

4.アレイトラバーサル

#!/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.アレイスライシング

ここに画像の説明を挿入

6.アレイの交換

ここに画像の説明を挿入

7.配列の削除

ここに画像の説明を挿入

8.配列に要素を追加します

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.配列パラメーターを関数に渡します

#!/bin/bash

test1() {
 echo "接收到的数据为:$@"
  newarr=($@)
 echo "新数组的数据:${newarr[*]}"
}
  arr=(1 2 3 4 5 6)
 echo "arr数组的数据: ${arr[*]}"

test1 ${arr[@]}

ここに画像の説明を挿入

第二に、ソートアルゴリズム

1.バブリングアルゴリズム

バブルの急増と同様に、データは配列内で小さいものから大きいものへ、または大きいものから小さいものへと前進し続けます。

  • 基本的な考え方:バブルソートの基本的な考え方は、2つの隣接する要素の値を比較し、条件が満たされた場合に要素の値を交換し、小さい方の要素を配列の前に移動し、大きい方の要素を移動することです要素を配列の後ろに配置して(つまり、2つの要素の位置を交換して)、小さい要素がバブルのように下から上に上がるようにします。
  • アルゴリズムのアイデア:バブリングアルゴリズムは、2層ループによって実装されます。このループでは、配列要素が1つしかないため、外側のループを使用して、並べ替えの回数、通常は並べ替える配列の長さから1回を引いた数を制御します。最後のループに残っているので、比較は不要で、配列は同時にソートが完了しています。内側のループは主に、配列内の隣接する各要素のサイズを比較して、位置を交換するかどうかを決定するために使用されます。比較と交換の数は、ソートラウンドの数とともに減少します。
#!/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.直接除去法

バブルソートと比較して、直接選択ソートは交換が少ないため、高速です

  • 基本的な考え方:指定した並べ替え位置を他の配列要素と比較します。条件が満たされると、要素の値が交換されます。ここではバブルソートが区別されることに注意してください。隣接する要素を交換する代わりに、条件を満たす要素が交換されます。指定された並べ替え位置(最後の要素からの並べ替えなど)。これにより、並べ替え位置が徐々に拡大し、最終的に配列全体が並べ替え形式になります。
#!/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.並べ替えを逆にします

元の配列の内容を逆の順序で並べ替えます

  • 基本的な考え方:
    配列の最後の要素を最初の要素に置き換えます。最後から2番目の要素は2番目の要素に置き換えられ、以下同様に、すべての配列要素が逆になって置き換えられます。
#!/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[@]}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_53496478/article/details/114823037