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を繰り返します
コードは次のとおりです
コードをコピー
|
関数 insert_sort($arr){ |
$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) クイック ソートは本質的にバブル ソートと同じであり、交換ソートの応用です。したがって、基本的な考え方は上記のバブルソートと同じです。
代码如下 |
复制幣 |
/**
* 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 */
|
http://www.bkjia.com/PHPjc/632898.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632898.html技術記事この文章は、一般的に行われている難解な php 順序計算法であり、これらの計算法が各位の学会に役立つことを望んでいます。
|