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

2017/02/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(...)

関連記事

アルゴリズム学習

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ