シェルスクリプトでのバブルソート、直接ソート、および逆ソート

1つ、バブルソート

ここに画像の説明を挿入します

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

基本的な考え方:
バブルソートの基本的な考え方は、隣接する2つの要素の値を比較することです。条件が満たされると、要素の値が交換され、小さい方の要素が配列の先頭に移動されます。大きい方の要素は配列の後ろに移動し(つまり、各要素の位置を2つ交換します)、小さい方の要素が泡のように下から上に上昇します。

アルゴリズムのアイデア:
バブリングアルゴリズムは、外側のループを使用して並べ替えのラウンド数を制御する2層ループによって実装されます。通常、配列が1つしかないため、並べ替えられる配列の長さは1に短縮されます。最後のループに要素が残っているため、比較は不要です。並べ替えが完了しました。内側のループは主に、配列内の隣接する各要素のサイズを比較して、位置を交換するかどうかを決定するために使用されます。比較と交換の数は、ソートラウンドの数とともに減少します。


#!/bin/bash
#冒泡排序

arr=(10 44 55 24 33 78 11)             #这里是我自己定义得数组arr
length=${#arr[@]}
echo "原数组为:${arr[@]} "
for((i=1;i<${#arr[@]};i++))            #外部循环,控制轮次
do
   for ((j=0;j<${#arr[@]}-$i;j++))     #内部循环,控制每轮比较次数
   do

   if [ ${arr[$j]} -gt ${arr[$j+1]} ]  #对每轮从头开始得相邻两个数进行比较,小的上浮(放前面),大的下沉(放后面替换位置) 
   then
   temp=${arr[$j]}                     #这里把前一个定义给一个变量temp
   arr[$j]=${arr[$j+1]}                #如果前一个大于后一个,则两两交换位置
   arr[$j+1]=$temp

   fi

   done
done
   echo "冒泡排序完得数组为:${arr[@]} "



成功!
ここに画像の説明を挿入します

2、直接ソート

ここに画像の説明を挿入します

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

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


#!/bin/bash
#直接排序

arr=(10 44 55 24 33 78 11)
echo "原先得数组为:${arr[@]} "
length=${#arr[@]}
for ((i=1;i<$length;i++))
do
    index=0                                #定义一个index变量,用来接收
    for ((j=1;j<=$length-i;j++))           #这里我用的是<=因为我下面用的是 -lt 来判断的,所以这里需要<=
    do
     if [ ${arr[$index]} -lt ${arr[$j]} ]  #这里我用的是小于
     then
       index=$j

     fi

       last=$[ $length - $i ]
       temp=${arr[$last]}
       arr[$last]=${arr[$index]}

       arr[$index]=$temp

    done
done
    echo "直接排序完得数组为:${arr[@]} "


ここに画像の説明を挿入します

3、逆ソート

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

基本的な考え方:
配列の最後の要素を最初の要素に置き換えます。最後から2番目の要素は2番目の要素に置き換えられ、以下同様に、すべての配列要素が逆になって置き換えられます。

#!/bin/bash
#直接排序

arr=(10 44 55 24 33 78 11)
echo "原先得数组为:${arr[@]} "
length=${#arr[@]}
for ((i=1;i<$length;i++))
do
    index=0
    for ((j=1;j<=$length-i;j++))
    do
     if [ ${arr[$index]} -lt ${arr[$j]} ]
     then
       index=$j

     fi

       last=$[ $length - $i ]      #从这里开始,以下就是首尾替换。
       temp=${arr[$last]}
       arr[$last]=${arr[$index]}

       arr[$index]=$temp

    done
done
    echo "直接排序完得数组为:${arr[@]} "


ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_44324367/article/details/114818318