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

PHP はいくつかの一般的な並べ替えアルゴリズムを実装しています

小云云
小云云オリジナル
2018-03-10 13:34:427027ブラウズ

交換ソート: 交換ソートの基本的な考え方は、2 つのレコードのキー値を比較し、2 つのレコードのキー値が逆の順序である場合、小さい方のレコードになるように 2 つのレコードを交換することです。キー値がシーケンス内で前方に移動されます。キー値が大きいレコードはシーケンスの後方に移動されます。 1. バブルソート

バブルソート(バブルソート、台湾語訳:バブルソートまたはバブルソート)は、シンプルな


ソートアルゴリズム

です。ソート対象のシーケンスを繰り返し調べて、一度に 2 つの要素を比較し、順序が間違っている場合はそれらを交換します。配列を訪問する作業は、それ以上の交換が必要なくなるまで繰り返されます。これは、配列がソートされたことを意味します。このアルゴリズムの名前は、小さい要素がスワッピングによって配列の先頭にゆっくりと「浮動」するという事実に由来しています。

手順:


隣接する要素を比較します。最初のものが 2 番目のものより大きい場合は、両方を交換します。

隣接する要素の各ペアに対して同じことを行い、最初の最初のペアから始めて、最後の最後のペアで終了します。この時点では、最後の要素が最大の数値である必要があります。

最後の要素を除くすべての要素に対して上記の手順を繰り返します。

比較する数値のペアがなくなるまで、要素の数を減らしながら上記の手順を繰り返します。

  1. バブルソートは最も理解しやすいですが、時間計算量 (O(n^2)) も最も大きいものの 1 つです。実装コードは次のとおりです。
    <br/>
    1. $arr=array(1,43,54,62,21,66,32,78,36,76,39); 関数

      getpao(
    2. $arr)

      ) {

    3. $len

      =
    4. count

      ($arr); //空の値を設定します(

      $i
    5. =1;

      $i737c441a0530621181bdaa96482e319b $arr[$i]) {それを左の配列に入れます

    6. else { そうです

    7. /左と右のアレイで同じソートを実行しますright_array = Quick_sort($right_array); //左のルーラーを右のルーラーとマージします

    8. return array_merge($left_array, array($base_num), $right_array); }

    9. 選択ソート

    選択ソートには、直接選択ソートとヒープソートの 2 つのタイプがあります。 i+1 ( i=1,2,3,...,n-1) レコード、順序付けされたシーケンスの i 番目のレコードとして最小のキー値を持つレコードを選択します

    3. 選択ソート 概要:

    選択並べ替えは、シンプルで直感的な

    並べ替えアルゴリズムです。仕組みは次のとおりです。まず、ソートされていないシーケンスの中で最小の要素を見つけて、それをソートされたシーケンスの先頭に格納します。次に、引き続きソートされていない残りの要素から最小の要素を見つけて、それをソートされたシーケンスの最後に置きます。すべての要素がソートされるまで続きます。

    選択の並べ替えも比較的簡単に理解でき、時間計算量も O(n^2) です。実装コードは次のとおりです:

    <br/>


    view plain

    コピー


    1. function select_sort($arr) {

    2. //実装アイデア 二重ループが完了し、外側の制御ラウンド番号、現在の最小値。内部層によって制御される比較の数

    3. //$i 現在の最小値の位置、比較に参加する必要がある要素

    4. for ($i =0, $len=count($arr); $i30f61579be0019ad4b2e1f24f3f8b444

      排序效果:


      希尔排序其实可以理解是插入排序的一个优化版,它的效率跟增量有关,增量要取多少,根据不同的数组是不同的,所以希尔排序是一个不稳定的排序算法,它的时间复杂度为O(nlogn)到O(n^2)之间,实现代码如下:

      function shellSort($arr) {
          $len = count($arr);    $stepSize = floor($len / 2);    while ($stepSize >= 1) {        for ($i = $stepSize; $i < $len; $i++) {            if ($arr[$i] < $arr[$i - $stepSize]) {                $t = $arr[$i];                $j = $i - $stepSize;                while ($j >= 0 && $t < $arr[$j]) {                    $arr[$j + $stepSize] = $arr[$j];                    $j -= $stepSize;
                      }                $arr[$j + $stepSize] = $t;
                  }
              }        // 缩小步长,再进行插入排序
              $stepSize = floor($stepSize / 2);
          }    return $arr;
      }$arr = [3,1,13,5,7,11,2,4,14,9,15,6,12,10,8];
      print_r(bubbleSort($arr));


      七、归并排序 

      介绍:

      归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(pide and Conquer)的一个非常典型的应用

      步骤:

      1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

      2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置

      3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

      4. 重复步骤3直到某一指针达到序列尾

      5. 将另一序列剩下的所有元素直接复制到合并序列尾

      排序效果:


      归并排序的时间复杂度也是O(nlogn)。原理是:对于两个排序好的数组,分别遍历这两个数组,获取较小的元素插入新的数组中,那么,这么新的数组也会是排序好的。代码如下:

      我们先来看看主函数部分:

      //交换函数function swap(array &$arr,$a,$b){
          $temp = $arr[$a];    $arr[$a] = $arr[$b];    $arr[$b] = $temp;
      }//归并算法总函数function MergeSort(array &$arr){
          $start = 0;    $end = count($arr) - 1;
          MSort($arr,$start,$end);
      }

      在总函数中,我们只调用了一个 MSort() 函数,因为我们要使用递归调用,所以将 MSort() 封装起来。

      下面我们来看看 MSort() 函数:

      function MSort(array &$arr,$start,$end){    //当子序列长度为1时,$start == $end,不用再分组    if($start < $end){        $mid = floor(($start + $end) / 2);	//将 $arr 平分为 $arr[$start - $mid] 和 $arr[$mid+1 - $end]        MSort($arr,$start,$mid);			//将 $arr[$start - $mid] 归并为有序的$arr[$start - $mid]        MSort($arr,$mid + 1,$end);			//将 $arr[$mid+1 - $end] 归并为有序的 $arr[$mid+1 - $end]        Merge($arr,$start,$mid,$end);       //将$arr[$start - $mid]部分和$arr[$mid+1 - $end]部分合并起来成为有序的$arr[$start - $end]
          }
      }

      上面的 MSort() 函数实现将数组分半再分半(直到子序列长度为1),然后将子序列合并起来。

      现在是我们的归并操作函数 Merge() :

      //归并操作function Merge(array &$arr,$start,$mid,$end){
          $i = $start;    $j=$mid + 1;    $k = $start;    $temparr = array();    while($i!=$mid+1 && $j!=$end+1)
          {       if($arr[$i] >= $arr[$j]){           $temparr[$k++] = $arr[$j++];
             }       else{           $temparr[$k++] = $arr[$i++];
             }
          }    //将第一个子序列的剩余部分添加到已经排好序的 $temparr 数组中
          while($i != $mid+1){        $temparr[$k++] = $arr[$i++];
          }    //将第二个子序列的剩余部分添加到已经排好序的 $temparr 数组中
          while($j != $end+1){        $temparr[$k++] = $arr[$j++];
          }    for($i=$start; $i<=$end; $i++){        $arr[$i] = $temparr[$i];
          }
      }

      到了这里,我们的归并算法就完了。我们调用试试:

      $arr = array(9,1,5,8,3,7,4,6,2);
      MergeSort($arr);
      var_dump($arr);

      相关推荐:

      php冒泡、选择、插入和快速排序算法分享

      PHP多维数组排序算法分析

      PHP排序算法系列之直接选择排序详解

以上がPHP はいくつかの一般的な並べ替えアルゴリズムを実装していますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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