ホームページ  >  記事  >  バックエンド開発  >  PHP は 6 つの並べ替えアルゴリズムを実装しています

PHP は 6 つの並べ替えアルゴリズムを実装しています

巴扎黑
巴扎黑オリジナル
2016-11-12 10:27:53976ブラウズ

まず、挿入ソート

たとえば、簡単な単語を使って説明します。 $arr = array(4,2,4,6,3,6,1,7,9); このような数値のセットは、順番にソートされます。次に、最初に配列の 2 番目の要素を最初の要素と比較します。最初の要素が 2 番目の要素より大きい場合は、次に、配列の 3 番目の要素を取得し、それを 2 番目の要素と比較します。 2 番目の要素をそれぞれ 、最初の要素を比較し、3 番目の要素が小さい場合は交換します。等々。これは挿入ソートであり、その時間頻度は 1+2+...+(n-1)=(n^2)/2 です。そのときの時間計算量は O(n^2) です。

php の実装コードは次のとおりです:


Php コード

<?php  
        function insertSort($arr){  
              $count = count($arr);  
              if($count<2){  
                  return $arr;   
              }  
              for($i=1;$i<$count;$i++){  
                    $tmp = $arr[$i];  
                     $j=$i-1;  
                     while(j>=0&&$arr[$j]<$arr[$i]){  
                         $arr[$i] = $arr[$j];                        
                         $arr[$j] = $tmp;  
                         $j--;  
                     }  
               }  
               return $arr;   
         }  
?>

2 つ目、選択の並べ替え


選択の並べ替えを言語で記述すると、次のようになります。例: $arr = array(4,3,5,2,1);
まず、最初の値を後続のすべての値と比較し、最小の数値を見つけて、それを最初の配列と交換します (もちろん、それが最初の最小値であるため、交換する必要はありません)、その後ループします。つまり、2 番目の数値を次の数値と比較し、最小の数値を見つけて、それを 2 番目の数値と交換する、というようになります。つまり、毎回最小の数値を見つけます。 残りの最小値を見つけます。 取得できます:初回、時間頻度は n です(最初のものと次の n-1 を比較し、最小のものを見つけ、それが最初のものであるかどうかを確認し、そうでない場合は交換します)未来、その後にマイナス 1 が続きます。時間計算量も O(n^2);

php 実装コードは次のとおりです:


Php コード

<?php  
        function selectSort($arr){  
  
              $count = count($arr);  
              if($count<2){  
                  return $arr;   
              }  
              for($i=0;$i<$count;$i++){  
                     $min=$i;  
                     for(j=$i+1;$j<$count;$j++){  
                         if($arr[$min]>$arr[$j]){  
                              $min = $j; //找到最小的那个元素的下标  
                         }  
                     }  
                     if($min!=$i){//如果下标不是$i 则互换。  
                            $tmp= $arr[$i];                        
                             $arr[$i] = $arr[$min];  
                             $arr[$min] = $tmp;  
                       }  
               }  
               return $arr;   
         }  
?>

3 つ目、バブル ソート


バブル ソートは選択ソートと実際に比較されますが、大きな違いはありません。一番小さいものを見つけて左端に置きます。問題を順番に解決してください。違いは、バブル ソートでは位置がより多く交換されるのに対し、選択ソートでは最小の要素の添字が検索され、最も左の要素と位置が直接交換されることです。
php 実装コードは次のとおりです:

Php コード

<?php  
        function selectSort($arr){  
  
              $count = count($arr);  
              if($count<2){  
                  return $arr;   
              }  
              for($i=0;$i<$count;$i++){  
                     for(j=$i+1;$j<$count;$j++){  
                         if($arr[$i]>$arr[$j]){  
                              $tmp= $arr[$i];                        
                             $arr[$i] = $arr[$i];  
                             $arr[$i] = $tmp;  
                         }  
                     }  
               }  
               return $arr;   
         }  
?>

4. クイック ソート


クイック ソート、言語で説明するには、配列から値 $a を選択し、それを残りの要素と比較します。 $a より大きい方の値を配列の右に置き、それ以外の場合は配列の左に入れます。次に、left と right をそれぞれ再帰的に呼び出します。つまり、left と right を細分化し、最後に配列をマージします。

php はクイック ソートを実装します:

Php コード

<?php  
        function mySort($arr){  
  
              $count = count($arr);  
              if($count<2){  
                  return $arr;   
              }  
              $key = $arr[0];//选择第一个元素作为比较元素,可选其他  
               $left = array();                
               $right = array();  
               for($i=1;$i<$count;$i++){  
                     if($key>=$arr[$i]){  
                         $left[] = $arr[$i];    
                     }else{  
                          $right[] = $arr[$i];  
                      }  
               }  
               $left = mySort($left);  
               $right = mySort($right);  
               $result = array_merge($left,$right);  
               return $result;   
         }  
?>

5. マージ ソート

実際、マージ ソートは一種の分割とマージのアイデアです。これは、クイックソートのアイデアと共通しており、左側に 1 つの山、右側に 1 つの山を配置してからマージします。並べ替えは再帰によって行われます。 違いは何ですか?それらの違いは、考え方の本質的な違いでもあります。クイックソートの分割では、サイズ比較のために特定の値が選択されるため、それらが左右に分割されます。つまり、小さい山は左側に配置され、大きい山は右側に配置されます。次に、小さな左が left1 と right1 に細分化されます。 。 。 。並べ替えは、同様の再帰を実行することによって行われます。つまり、細分化し続けた場合、再帰終了時の left1 が最小値になります。

そして、マージソートとは、配列を左と右から幾何学的に最小粒度2または1に再帰的に分割し、サイズの比較を開始してからマージすることです。ここでの比較サイズは次のとおりです。息子の左側の要素が息子の右側の要素と比較され、ソートされて父親の左側または右側にマージされます。ここで、最後の 2 つの配列がそれぞれソートおよびマージされるまでは、最初の左と右のそれぞれの順序のみが確認でき、配列全体の順序は最後の左と右までまだ確認できません。本当の意味での並べ替え。

PHPコード

<?php  
function gbSort($arr){  
       if(count($arr)<=1){return $arr;}  
       $min = floor(count($arr)/2);//取中间数字进行拆分  
       $left = array_slice($arr,0,$min);  
       $right = array_slice($arr,$min);  
       $left = gbSort($left);  //递归  
       $right = gbSort($right);  
       return get_merge($left,$right);//调用排序合并函数进行合并  
}  
function get_merge($left,$right){  
        while(count($left) && count($right)){  
               $m[] = $left[0]>$right[0] ? array_shift($right) : array_shift($left);  
               //进行比较,小的移除,并且放入到数组$m中。  
        }  
        return arr_merge($m,$left,$right);//进行合并(由于不知道left right 哪个会为空,所以进行统一合并)  
}  
  
?>

6、ヒープソート

続く


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。