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(...)
関連記事
アルゴリズム学習
0 件のコメント:
コメントを投稿