アルゴリズム-バブルソート(PHPコードで実装)

バブルソートを完全に理解するための3分

1.原則:隣接する2つの要素を比較し、値が大きい方の要素を右側に入れ替えます。

2.アイデア:隣接する2つの数値を順番に比較し、小さい方を前に、大きい方を後ろに配置します。

(1)最初の比較:最初に1番目と2番目の数値を比較し、10進数を前に、大きな数を後ろに配置します。

(2)2番目と3番目の数値を比較し、10進数を前に、大きな数を後ろに置きます。

(3)このように続けて、最後と比較される2つの数値を確認し、10進数を前に、大きな数を後ろに置き、すべてのソートが完了するまで手順を繰り返します

(4)前の比較が完了した後、最後の数は配列内の最大数でなければならないため、2番目の比較が実行されるとき、最後の数は比較に含まれません。

(5)2回目の比較が完了した後、最後から2番目の数値も配列の最後から2番目の数値でなければならないため、3回目の比較では、最後の2つの数値は比較に含まれません。

(6)類推により、各パスの比較数は順次減少します

3.例:
(1)配列をソートするには:[10,1,35,61,89,36,55]
ここに画像の説明を挿入
(2)最初のソート:

最初の種類:10と1、10は1より大きい、交換位置[1,10,35,61,89,36,55]

2回目のソート:10と35を比較し、10は35未満であり、位置を入れ替えない[1,10,35,61,89,36,55]

ソートの3番目のラウンド:35と61を比較し、35は61未満、位置を入れ替えない[1,10,35,61,89,36,55]

並べ替えの4番目のラウンド:61と89を比較し、61が89未満、位置を入れ替えない[1,10,35,61,89,36,55]

5番目のパスの並べ替え:89と36を比較、89が36より大きい、ポジションを交換[1,10,35,61,36,89,55]

6番目の時系列:89と55を比較し、89が55より大きい、ポジションを交換[1,10,35,61,36,55,89]

最初のパスで合計6つの比較が行われ、並べ替えの結果:[1,10,35,61,36,55,89]
      ここに画像の説明を挿入
(3)2番目のパスが並べ替えられました:

最初の並べ替え:1と10が比較され、1は10未満であり、位置1、10、35、61、36、55、89は交換されません

2番目の種類:10と35の比較、10は35未満、位置1、10、35、61、36、55、89を入れ替えない

3番目の順序:35と61の比較、35は61未満、ポジション1、10、35、61、36、55、89を交換しない

4次:61と3​​6を比較し、61が36より大きい、ポジションを交換する1,10,35,36,61,55,89

5番目の順序:61と55を比較し、61が55より大きい、ポジションを交換する1,10,35,36,55,61,89

2回目のパスで合計5つの比較が行われ、並べ替えられた結果:1,10,35,36,55,61,89

(4)3番目の時系列:

1は10と比較され、1は10未満です。ポジションの交換はありません1,10,35,36,55,61,89

2番目の種類:10と35の比較、10は35未満、ポジションを交換しない1,10,35,36,55,61,89

3番目の種類:35と36の比較、35は36未満、ポジション1、10、35、36、55、61、89を交換しない

4次:36と61を比較し、36は61未満であり、位置1、10、35、36、55、61、89を入れ替えない

第3ラウンドでは、合計4つの比較が行われ、並べ替えの結果は1,10,35,36,55,61,89でした​​。

これまでのところ、立場はすでに整然としている。
4.アルゴリズム分析:

(1)次のことがわかります:N個の数値を並べ替える必要があり、合計N-1回のパスが並べ替えられ、各iパスの並べ替えの数は(Ni)回なので、二重ループステートメントを使用でき、外側の層はループの回数を制御し、内側はパスごとのサイクル数を制御する

(2)バブルソートの利点:ソートを実行するたびに比較が少なくなります。ソートを実行するたびに大きな値が見つかるからです。上記の例のように:最初のパスの後、最後の数は最大数でなければなりません。2番目のパスがソートされるとき、最後の数を除く他の数を比較するだけでよく、最大数を見つけることもできます。の数は、第2ラウンドの比較に参加した数よりも後ろにランク付けされています。第3ラウンドの比較では、最後の2つの数を除く他の数を比較する必要があるだけです。つまり、毎回比較はありません。トリップごとに1回少ないと比較すると、アルゴリズムの量がある程度削減されます。

(3)時間の複雑さ

1.データの順序が正の場合、ソートを完了するために必要なのは1回だけです。必要な比較時間Cと記録された移動時間Mはどちらも最小値に達します。つまり、Cmin = n-1; Mmin = 0;したがって、バブルソートの時間の複雑さはO(n)が最適です。

2.残念ながら、データの順序が逆の場合、n-1回ソートする必要があります。各シーケンスにはni比較(1≤i≤n-1)が必要であり、各比較は交換レコード位置に到達するためにレコードを3回移動する必要があります。この場合、比較と移動の数は最大に達しました。
    ここに画像の説明を挿入
要約すると、バブルソートの平均時間の合計の複雑さはO(n2)であり、時間の複雑さはデータステータスとは無関係です。

PHPコードの実装

1.基本的なコードの実装

    /**
     * 冒泡排序
     * @param $arr
     */
    public function bubbleSort($arr)
    {
    
    
        $length = count($arr);
        for ($i=1;$i<$length;$i++) {
    
     //需要执行 length-1 趟排序
            for ($j=0;$j<$length-$i;$j++) {
    
     //每趟需要执行 length-i 次比较
                //两两比较相邻元素
                if($arr[$j] > $arr[$j+1]){
    
    
                    $this->swap($arr, $j,$j+1);
                }
            }
        }
        return $arr;
    }

    /**
     * 数组元素交换位置
     * @param array $arr
     * @param $a
     * @param $b
     */
    function swap(array &$arr, $a, $b)
    {
    
    
        $temp = $arr[$a];
        $arr[$a] = $arr[$b];
        $arr[$b] = $temp;
    }

2.ソートの最適化

フラグを導入して、次のサイクルに入る必要があるかどうかを判断できます。データ交換がない場合は、データがすでに順序付けられており、次のサイクルに入る必要がないことを意味します。

    /**
     * 冒泡排序
     * @param $arr
     */
    public function bubbleSort($arr)
    {
    
    
        $length = count($arr);
        $flag = true; //是否需要进行下一趟排序标志
        if ($flag) {
    
    
            for ($i=1;$i<$length;$i++) {
    
     //需要执行 length-1 趟排序
                $flag = false; //每次进入一趟循环默认下一次不再循环
                for ($j=0;$j<$length-$i;$j++) {
    
     //每趟需要执行 length-i 次比较
                    //两两比较相邻记录
                    if($arr[$j] > $arr[$j+1]){
    
    
                        $this->swap($arr, $j,$j+1);
                        $flag = true;  //当有数据发生交换,说明还需要下一趟排序
                    }
                }
            }
        }
        return $arr;
    }

    /**
     * 数组元素交换位置
     * @param array $arr
     * @param $a
     * @param $b
     */
    function swap(array &$arr, $a, $b)
    {
    
    
        $temp = $arr[$a];
        $arr[$a] = $arr[$b];
        $arr[$b] = $temp;
    }

この記事の参照アドレス

  1. https://www.jb51.net/article/138558.htm
  2. https://www.cnblogs.com/bigdata-stone/p/10464243.html

おすすめ

転載: blog.csdn.net/magentodaddy/article/details/108600523