この記事を読むことで、「配列ソートアルゴリズム」(バブルソートアルゴリズム、直接ソートアルゴリズム、逆ソートアルゴリズム)の問題が発生しなくなります。

バブルソートアルゴリズム(バブルソート)

アルゴリズムの概要と基本的な考え方

  • このアルゴリズムの名前の由来は、炭酸飲料の二酸化炭素の泡が最終的に一番上に上がるのと同じように、小さい要素が交換によってシーケンスの一番上にゆっくりと「浮かぶ」(昇順または降順)ためです。 、したがって「バブル」ソートという名前
  • 基本的な考え方:バブルソートは、2つの隣接する要素の値を比較し、対応する条件が満たされている場合は、要素の値を相互に交換し、小さい方の要素を配列の前に移動し、大きい方の要素を移動することです。配列の後ろにある要素(つまり、2つの要素の位置を交換する)。これにより、小さい方の要素がバブルのように下から上に上昇します。
  • アルゴリズムのアイデア:バブリングアルゴリズムはダブルループによって実現されます。
    外側のループは、並べ替えの回数(つまり、並べ替え操作の数回)を制御するために使用されます。通常、並べ替えられる配列の長さは「マイナス1」です。 "回、最後のサイクルだけが残っているため、次の配列要素を比較する必要はなく、配列はすでに並べ替えられています。
    内側のループは、配列内の隣接する各要素のサイズを比較して、位置を交換するかどうかを決定するために使用されます。比較と交換の数は、並べ替えラウンドの数とともに減少します。

ソートプロセスの概略図

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

コマンドスクリプト

方法1

[root@localhost ~]# ./28.sh 
需排序数组的值为:61 6 22 1 4 13
排序后的新数组值为:1 4 6 13 22 61
[root@localhost ~]# vim 28.sh

#!/bin/bash

sz=(61 6 22 1 4 13)
echo "需排序数组的值为:${sz[@]}"

leng=${
    
    #sz[@]}                 
【获取数组长度】

for ((w=1;w<$leng;w++))        
【定义比较轮数,为数组长度减1,因为这里是小于,所以不用减1,并每次执行+1的操作】
do

  for ((e=0;e<$leng-$w;e++))  
【因为这里的变量e是用来定义第一个比较元素的索引值,所以从0开始,又因为最后一次比较是索引4和索引5进行比较,所以这里变量e的值小于数组长度
减变量w(减变量w而不直接减1是因为待比较元素的位置需要随着轮数的增加而减少)】
  do
  one=${
    
    sz[$e]}                
【定义第1个比较元素的值】
  two=${
    
    sz[$e+1]}
【定义第2个比较元素的值】
    if [ $one -gt $two ];then
【如果第1个元素的值大于第2个元素的值,则只需位置交换操作】
    sz1=$one
【把第一个元素的值赋给临时变量sz1】
    sz[$e]=$two
【把第二个元素的值赋给第一个元素】
    sz[$e+1]=$sz1
【再把第一个元素的值(sz1的值)赋给第二个元素】
    fi
  done

done

echo "排序后的新数组值为:${sz[*]}"  

方法2(並べ替える必要のある配列値を手動で定義する)

[root@localhost ~]# ./28-1.sh 
输入你需要排序的数组:33 2 28 5 44 32 18 29
需排序数组的值为:33 2 28 5 44 32 18 29
排序后的新数组值为:2 5 18 28 29 32 33 44
[root@localhost ~]# vim 28-1.sh 

#!/bin/bash
read -p "输入你需要排序的数组:" num     【将需要排序的数组值赋给变量num】
sz=($num)                             【与方式一的区别在于这里是通过变量num获取到值,而不是脚本内定义好值】
echo "需排序数组的值为:${sz[@]}"

leng=${
    
    #sz[@]}

for ((w=1;w<$leng;w++))
do

  for ((e=0;e<$leng-$w;e++))
  do
  one=${
    
    sz[$e]}
  two=${
    
    sz[$e+1]}

    if [ $one -gt $two ];then
    sz1=$one
    sz[$e]=$two
    sz[$e+1]=$sz1

    fi
  done

done

echo "排序后的新数组值为:${sz[*]}"  

方法3(アルゴリズムを関数にカプセル化し、関数を介してアルゴリズムにソートされるパラメーターを渡します)

[root@localhost ~]# ./28-2.sh 88 91 102 32 45 27 1 13
需排序数组的值为:88 91 102 32 45 27 1 13
排序后的新数组值为:1 13 27 32 45 88 91 102
[root@localhost ~]# vim 28-2.sh 

sz=($@)
echo "需排序数组的值为:${sz[@]}"

leng=${
    
    #sz[@]}

for ((w=1;w<$leng;w++))
do

  for ((e=0;e<$leng-$w;e++))
  do
  one=${
    
    sz[$e]}
  two=${
    
    sz[$e+1]}

    if [ $one -gt $two ];then
    sz1=$one
    sz[$e]=$two
    sz[$e+1]=$sz1

    fi
  done

done

echo "排序后的新数组值为:${sz[*]}"  

}

#################main#################   【仅为注释从这以下为主代码】
list=$@                                  【将命令行获取到的数组值赋给变量list】
paixu $list                              【将变量list获得的值传参到函数paixu内】

ストレートセレクトソーティング(ストレートセレクトソーティング)

アルゴリズムの概要と基本的な考え方

  • バブルソートに比べ、直接選択ソートの交換回数が少ないため、計算速度が速くなります。
  • 基本的な考え方:指定された並べ替え位置を他の配列要素と個別に比較し、条件が満たされた場合は要素値を交換します
  • バブルソートとの違い:隣接する要素を交換する代わりに、条件を満たす要素が指定されたソート位置と直接交換されます(たとえば、最後の要素からのソート)。このようにして、ソートされた位置が徐々に拡大し、最終的に配列全体がソートされた形式で出力されます。

ソートプロセスの概略図

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

コマンドスクリプト

[root@localhost ~]# ./29.sh 
待排序的数组值为:63 4 24 1 3 15
排序后的数组值为: 1 3 4 15 24 63
[root@localhost ~]# vim 29.sh

#!/bin/bash

sz=(63 4 24 1 3 15)
echo "待排序的数组值为:${sz[@]}"
leng=${
    
    #sz[@]}                           【定义排序的轮数】

for ((w=1;w<$leng;w++))
do

   jx=0                                  【假设所以为0的元素是最大,并将值赋给jx】
   for ((e=1;e<=$leng-$w;e++))           【定义和第一个元素比较的索引,用来确定最大的元素索引】   
   do

     max=${
    
    sz[$jx]}                      【定义最大的元素的值】
     cs=${
    
    sz[$e]}                        【定义从索引1开始比较的元素的值】

     if [ $cs -gt $max ];then            【判断如果从索引1开始比较的元素值大于当前最大元素的值时,则记录最大值的索引到变量jx】
        jx=$e
     fi
   done
qz=$[$leng-$w]                           【定义每一轮比较的最后一个元素的索引】
qz1=${
    
    sz[$qz]}                           【把当前轮次的最后一个元素的值赋给临时变量qz1】
sz[$qz]=${
    
    sz[$jx]}                       【把最大的值赋给当前轮次的最后一个元素】
sz[$jx]=$qz1                             【把qz1里的原来最后一个元素的值赋给原来最大值所在索引的元素】

done

echo "排序后的数组值为: ${sz[*]}"

逆ソートアルゴリズム(逆ソート)

アルゴリズムの概要と基本的な考え方

  • 元の配列の内容を逆の順序で並べ替えます
  • 基本的な考え方:配列の最後の要素を最初の要素に置き換え、最後から2番目の要素を2番目の要素に置き換え、以下同様に、すべての配列要素が逆になって置き換えられるまで続けます。

コマンドスクリプト

[root@localhost ~]# ./30.sh 
待排序的数组为:3 4 24 31 43 65 89
反转排序后的数组顺序为:89 65 43 31 24 4 3
[root@localhost ~]# vim 30.sh

#!/bin/bash

sz=(3 4 24 31 43 65 89)
echo "待排序的数组为:${sz[@]}"

leng=${
    
    #sz[@]}                  【输出数组sz的长度值并赋给变量leng】

for ((w=0; w<$leng/2; w++))     【索引从0开始,/2是折半对调,所以是长度/2,且索引每次增加1次】
do
  one=${
    
    sz[$w]}                 【将第一个索引对应的元素赋值给变量one】  
  two=${
    
    sz[$leng-1-$w]}         【将最后一个索引对应的元素赋给变量two】

  sz1=$one
  sz[$w]=$two                   【将最后一个索引对应的元素赋给第一个索引对应的元素】
  sz[$leng-1-$w]=$sz1           【将第一个索引对应的元素赋给最后一个索引对应的元素】

done

echo "反转排序后的数组顺序为:${sz[@]}"

おすすめ

転載: blog.csdn.net/TaKe___Easy/article/details/114690492