[アルゴリズム] クイックソートの実装(PHP編)

2017年2月12日

PHP テクノロジー プログラミング 特集

t f B! P L
PHPにおけるクイックソートはJavascriptと同じ感覚で問題なく行けます。 言語変更方法を記事最後に書いておいたので参考にしてください。 このブログからは全く読み取れないんですが、前回までPHPの確認はvertualboxを使って行っていたんですが、今回からはmac版dockerを使って行っています。 少しぎこちなかったんですが、dockerに慣れるために、めんどくささを我慢しています。

ソース

<?php function mid($x , $y , $z){ if ($x < $y) { if ($y < $z){ return $y; } else if ($z < $x){ return $x; } else{ return $z; } } else { if ($z < $y){ return $y; } else if ($x < $z){ return $x; } else{ return $z; } } } function quickSort($numbers , $begin=null , $end=null){ if($begin !== null && $end !== null && ($end - $begin) <= 1){return $numbers;} // 左辺と右辺の開始位置を定義 $begin = ($begin === null)? 0 : $begin; $end = ($end === null)? count($numbers) -1 : $end; $left = $begin; $right = $end; if($begin >= $end){return $numbers;} // ピボット(中央の値) $pivot = mid($numbers[$left] , $numbers[$left+(int)(($right-$left)/2)] , $numbers[$right]); // ソート処理実行(pivotが交差するまで続行) while(1){ // 左辺のpivotよりも大きい値見つける while($numbers[$left] < $pivot){$left++;} // 右辺のpivotよりも小さい値をみつける while($numbers[$right] > $pivot){$right--;} //pivotが交差したら終了 if($left >= $right){break;} // 値の入れ替え処理 $tmp = $numbers[$left]; $numbers[$left] = $numbers[$right]; $numbers[$right] = $tmp; // 繰り返し対応 $left++; $right--; } // pivotの左辺のソート処理 $numbers = quickSort($numbers , $begin , $left); // pivotの右辺のソート処理 $numbers = quickSort($numbers , $right , $end); return $numbers; } $res = quickSort(array(20,10,2,12,7,16,8,13,1) , null , null); echo join(",",$res).PHP_EOL;

実行

# php quickSort.php 1,2,7,8,10,12,13,16,20

解説

実行エラーの対処「PHP Notice: Array to string conversion」

どうやら配列を文字列にコンバートしている事を指摘されているようだ。 ソースのquickSort関数の戻り値をechoしようとして echo quickSort(array(20,10,2,12,7,16,8,13,1) , null , null); と書いていてこのエラーが出ていました。 配列を処理する様に下記に修正して対応完了です。 $res = quickSort(array(20,10,2,12,7,16,8,13,1) , null , null); echo join(",",$res).PHP_EOL;

javascriptからのローカライズ処理

JSソースをPHPに変換するのは比較的簡単です。 今回のソースであれば以下の点に注意するだけでイケています。
・変数に$をつける(※JS変数に$がついている場合は不要) ・配列.lengthを→count(配列)に変更 ・pareInt(数式,10)を(int)(数式)に変更 ・関数の$beginと$endが初回実行時に未指定になるので、$begin=null , $end=nullとデフォルト値を指定 ・JSのtypeofをnull判定に変更、ただしJSのundefined判定と同じにするにはisset関数を使ってもいいのだが、少しややこしくなるので今回はnullで対応 ・JSはプログラムの行末に;セミコロンを付けなくても解消してしまえば問題ないが、PHPはちゃんと行末に;を付けないとエラーになる。 ・配列定義がJSは[...]に対してphpはarray(...)

関連記事

アルゴリズム学習

このブログを検索

プロフィール

自分の写真
町田市, 東京都, Japan
プログラミングとサーバーを心の底から楽しむクリエーターです。 経営者であり、開発者でもありますが、得意としているのは、アイデア創出。

ブログ アーカイブ

QooQ