ホームページ >バックエンド開発 >PHPチュートリアル >PHP ソート アルゴリズム PHP ソート クラシック アルゴリズム_PHP チュートリアル

PHP ソート アルゴリズム PHP ソート クラシック アルゴリズム_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:47:09959ブラウズ

この記事では、いくつかの優れた PHP ソート アルゴリズムをまとめます。これらのアルゴリズムがすべての学生に役立つことを願っています。

コードは次のとおりです コードをコピー


1. バブルアルゴリズム、ソートアルゴリズム、ソートの過程で常に小さい数字が前方に、大きな数字が後方に配置されるため、バブルが上昇するのと同じなので、バブルソートと呼ばれます

$array = 配列(a,f,c,b,e,h,j,i,g);

関数maopao_fun($array){

if($len $arr を返す

}

$count = count($array);

for($i=0;$i

for($j=$count-1;$j>$i;$j--){

$tmp = $array[$j];

$array[$j] = $array[$j-1];

$array[$j-1] = $tmp;

}

}

$array を返す

}

2.クイックソート、

クイックソートはバブルソートを改良したものです。

1962 年に C. A. R. ホアによって提案されました。その基本的な考え方は、1 つの並べ替えパスを通じて、並べ替えられるデータを 2 つの独立した部分に分割することです。 一方の部分のすべてのデータが、もう一方の部分のすべてのデータよりも小さい場合、このメソッドを使用して、データの 2 つの部分をそれぞれすばやく並べ替えます。

ソートプロセス全体は再帰的に実行できるため、データ全体が順序付けられたシーケンスになります。

関数クイックソート($arr){

$len = count($arr);

if($len
$arr を返す

}

$key = $arr[0];

$left_arr = 配列();

$right_arr = 配列();

for($i=1; $i

if($arr[$i]

$left_arr[] = $arr[$i];

} その他 {

$right_arr[] = $arr[$i];

}

}

$left_arr = クイックソート($left_arr);

$right_arr = クイックソート($right_arr);

array_merge($left_arr, array($key), $right_arr) を返す

}

3.並べ替えを選択
各パスは、並べ替えられるデータ要素から最小 (または最大) の要素を選択します。
順序は、ソートされるすべてのデータ要素が配置されるまで、ソートされた配列の最後に配置されます。 選択ソートは不安定なソート方法です

次の要素を取り出し、ソートされた要素シーケンスを後ろから前にスキャンします (ソートされた) 要素が新しい要素より大きい場合、要素を次の位置に移動します
コードは次のとおりです コードをコピー

関数 select_sort($arr){

$count = count($arr);

for($i=0; $i for($j=$i+1; $j if ($arr[$i] > $arr[$j]){

$tmp = $arr[$i];

$arr[$i] = $arr[$j];

$arr[$j] = $tmp;

}

}

$arr を返す

}

4. 挿入ソート

最初の要素から始めて、要素はソートされているとみなすことができます
並べ替えられた要素が新しい要素以下になる位置が見つかるまで、手順 3 を繰り返します

新しい要素を次の位置に挿入します
ステップ2を繰り返します



コードは次のとおりです

コードをコピー $count = count($arr); for($i=1; $i

$tmp = $arr[$i];

$j = $i - 1; ️ {

$arr[$j+1] = $arr[$j];

$arr[$j] = $tmp;

$j--;

}

$arr を返す

}

$arr = 配列(49,38,65,97,76,13,27);

Print_r(insert_sort($arr));

4つのソートアルゴリズムのPHP実装

1) 挿入ソートの基本的な考え方は次のとおりです:
ソート対象のレコードは、すべてのレコードが挿入されるまで、そのキー サイズに従って、以前にソートされたサブファイル内の適切な位置に挿入されます。
2) 選択ソートの基本的な考え方は次のとおりです:
各パスでは、並べ替えられるレコードから最小のキーワードを持つレコードが選択され、すべてのレコードが並べ替えられるまで、並べ替えられたサブファイルの最後に配置されます。
3) バブルソートの基本的な考え方は次のとおりです:
ソート対象のレコードのキーワードをペアごとに比較し、順序が逆になっている場合は、逆の順序のレコードがなくなるまで入れ替えます。
4) クイック ソートは本質的にバブル ソートと同じであり、交換ソートの応用です。したがって、基本的な考え方は上記のバブルソートと同じです。

関数 insert_sort($arr){
代码如下 复制幣

/**
* 4 つの並べ替えアルゴリズム設計 (PHP)
*
* 1) インサーションソートの基本的な考え方は次のとおりです:
ソート対象のレコードは、すべてのレコードが挿入されるまで、そのキー サイズに従って、以前にソートされたサブファイル内の適切な位置に挿入されます。
2) 選択ソートの基本的な考え方は次のとおりです:
各パスでは、ソート対象のレコードから最小のキーワードを持つレコードが選択され、すべてのレコードがソートされるまで、ソートされたサブファイルの末尾に順序が配置されます。
3) バブルソートの基本的な考え方は次のとおりです:
ソート対象のレコードのキーワードをペアごとに比較し、順序が逆になっている場合は、逆の順序のレコードがなくなるまで入れ替えます。
4) クイック ソートは本質的にバブル ソートと同じであり、交換ソートの応用です。したがって、基本的な考え方は上記のバブルソートと同じです。
*
* @著者Quanshuidingdang
​*/
クラスソート{
 プライベート $arr = array(); 
 private $sort = 'insert';
 プライベート $marker = '_sort';
 
 プライベート $debug = TRUE;
 
 /**
* コンストラクター
*
* @param array 例: $config = array (
'arr' => array(22,3,41,18), //ソートが必要な配列値
'Sort' = & gt'insert', // 可能な値: Insert、select、Bubble、Quick
; 'debug' => TRUE //可能な値: TRUE、FALSE
)
​*/
 パブリック関数 __construct($config = array()) {
  if ( count($config) > 0) {
   $this->_init($config);
  }
 }
 
 /**
* 並べ替え結果を取得します
​*/
 パブリック関数 display() {
  $this->arr;を返す
 }
 
 /**
*初期化
*
* @param配列
* @return bool
​*/
 プライベート関数 _init($config = array()) {
  //パラメータ判断
  if ( !is_array($config) OR count($config) == 0) {
   if ($this->debug === TRUE) {
    $this->_log("sort_init_param_invaild");
   }
   FALSE を返します;
  }
  
  //初化成员变量
  foreach ($config as $key => $val) {
   if ( isset($this->$key)) {
    $this->$key = $val;
   }
  }
  
  // 対応する成り方を使用して排列を完了します
  $method = $this->sort 。 $this->マーカー;
  if ( ! method_exists($this, $method)) {
   if ($this->debug === TRUE) {
    $this->_log("sort_method_invaild");
   }
   FALSE を返します;
  }
  
  if ( FALSE === ($this->arr = $this->$method($this->arr)))
   FALSE を返します;
  TRUE を返します;
 }
 
 /**
* 挿入ソート
*
* @param配列
* @return bool
​*/
 プライベート関数 insert_sort($arr) {
  //パラメータ判断
  if ( ! is_array($arr) OR count($arr) == 0) {
   if ($this->debug === TRUE) {
    $this->_log("sort_array(insert)_invaild");
   }
   FALSE を返します;
  }
  
  // 具体的な实现
  $count = count($arr);
  for ($i = 1; $i    $tmp = $arr[$i];
   for($j = $i-1; $j >= 0; $j--) {
    if($arr[$j] > $tmp) {
     $arr[$j+1] = $arr[$j];
     $arr[$j] = $tmp;
    }
   }
  }
  $arr を返します;
 }
 
 /**
*並べ替えを選択
*
* @param配列
* @return bool
​*/
 プライベート関数 select_sort($arr) {
  //パラメータ判断
  if ( ! is_array($arr) OR count($arr) == 0) {
   if ($this->debug === TRUE) {
    $this->_log("sort_array(select)_invaild");
   }
   FALSE を返します;
  }
  
  // 具体的な实现
  $count = count($arr);
  for ($i = 0; $i    $min = $i;
   for ($j = $i+1; $j     if ($arr[$min] > $arr[$j]) $min = $j;
   }
   if ($min != $i) {
    $tmp = $arr[$min];
    $arr[$min] = $arr[$i];
    $arr[$i] = $tmp;
   }
  }
  $arr を返します;
 }
 
 /**
* バブルソート
*
* @param配列
* @return bool
​*/
 プライベート関数 bubble_sort($arr) {
  //パラメータ判断
  if ( ! is_array($arr) OR count($arr) == 0) {
   if ($this->debug === TRUE) {
    $this->_log("sort_array(bubble)_invaild");
   }
   FALSE を返します;
  }
  
  // 具体的な实现
  $count = count($arr);
  for ($i = 0; $i    for ($j = $count-1; $j > $i; $j--) {
    if ($arr[$j]      $tmp = $arr[$j];
     $arr[$j] = $arr[$j-1];
     $arr[$j-1] = $tmp;
    }
   }
  }
  $arr を返します。 
 }
 
 /**
*クイックソート
*
* @param配列
* @return bool
​*/
 プライベート関数 Quick_sort($arr) {
  // 具体的な实现
  if (count($arr)   $key = $arr[0];
  $left_arr = array();
  $right_arr = array();
  for ($i = 1; $i    if ($arr[$i]     $left_arr[] = $arr[$i];
   それ以外
    $right_arr[] = $arr[$i];
  }
  $left_arr = $this->quick_sort($left_arr);
  $right_arr = $this->quick_sort($right_arr);

return array_merge($left_arr, array($key), $right_arr);
 }
 
 /**
* ロギング
​*/
 プライベート関数 _log($msg) {
  $msg = '日付[' . date('Y-m-d H:i:s') 。 '] ' 。 $msg 。 'ん';
  return @file_put_contents('sort_err.log', $msg, FILE_APPEND);
 }
}

/*sort.phpの終わり*/
/*場所 htdocs/sort.php */

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632898.html技術記事この文章は、一般的に行われている難解な php 順序計算法であり、これらの計算法が各位の学会に役立つことを望んでいます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。