質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • PHP

    20912questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • teratail

    415questions

    teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

練習問題03

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,020

b1ackc0ffee

score 197

下記のような問題があります。
皆さんはどのように解かれますか?
わたしのコードを記載しますので、突っ込みやアドバイスなどあればご教示頂けると助かります。
もっと簡単だよ、こんな関数あるよとかあれば宜しくお願い致します。

問題
以下のPHPプログラムで定義される配列がある。
$array = array(50, 37, 29, 59, 31, 88, 48, 87, 3, 63);
PHPの内部関数でソートせず、小さいものから順に出力せよ。


 
$rarray = array(50, 37, 29, 59, 31, 88, 48, 87, 3, 62);

 $length = count($rarray);

 trace($rarray);
 for ($i = 0; $i < $length; $i ++) {
         for ($j = $i + 1; $j < $length; $j++) {
                 if ($rarray[$i] > $rarray[$j]) {
                         $tmp = $rarray[$i];
                         $rarray[$i] = $rarray[$j];
                         $rarray[$j] = $tmp;
                         trace($rarray, $i, $j);
                 }
         }
 }

 foreach ($rarray as $value) {
         echo $value . "\n";
 }

 function trace($arr, $i = 0, $j = 0) {
         echo "($i,$j)";
         foreach ($arr as $value) {
                 echo $value . ",";
         }
         echo "\n";
 }


考え方
例1)自分で配列を小さい順から並ぶように入れ替えてから、for文を使って出力(echo)する。
例2)「配列の中で一番小さい数を出力して、その数を配列から削除する」操作を、
配列が空になるまで繰り返す。
例3)左右で値を比較して、小さい数を左に置いていくいくようにする。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

0

例3を再帰関数で実行してみました。
考え方(例3)的にもプログラム的にも分かりやすいと思いますよ!

$array = [ 50, 37, 29, 59, 31, 88, 48, 87, 3, 63 ];

// 並び替え
recursive( $array );

//出力
foreach( $array as $value ) {
    print( "$value\n" );
}

// 関数群
function recursive( &$array, $i = 0, $j = 0 ) {
    if ( count( $array )-1 === $i ) {
        return;
    }
    if ( $array[ $i ] > $array[ $j ] ) {
        swap( $array[ $i ], $array[ $j ] );
    }

    if ( count( $array )-1 === $j ) {
        $i++;
        $j = $i;
    }
    recursive( $array, $i, $j+1 );
}

function swap( &$a, &$b ) {
    $t = $b;
    $b = $a;
    $a = $t;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

私も例3でやってみました。

結構邪道かも。
でも配列の中身の入れ替えはPHPらしくやってます。

$rarray = array(50, 37, 29, 59, 31, 88, 48, 87, 3, 62);
$notyet = 1; //ソートが終わったかどうかを判断

while ($notyet == 1) {//dosortで書き換えがなくなるまでは続ける。
    $notyet = dosort($rarray);
}

print implode("\n", $rarray);
print "\n";
exit;

function dosort(&$rarray) {
    $found = 0;
    foreach ($rarray as $key => $val) {
        if ($key == count($rarray) - 1) { //配列の最後
            break;
        }
        if ($val > $rarray[$key + 1]) {
            //ここで中身の入れ替え
            list($rarray[$key], $rarray[$key + 1]) = array($rarray[$key + 1], $rarray[$key]);
            $found = 1; //一回でも書き換えがあったらフラグを立てる
        }
    }
    return $found;//ここで0が帰ればソート終了
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

この手の問題は、ソートアルゴリズムとして、いくつかパターンがあります。
返答方法としては邪道かもしれませんが、下記ページに最速のアルゴリズムとしてクイックソートのソースが書いてありますので、載せておきます。

http://qiita.com/kiimiiis/items/845181f9a81a674ffe96

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

例2をコードに落としてみました。

$array = array(50, 37, 29, 59, 31, 88, 48, 87, 3, 63); 
while ($array){
  $min_number = min($array);
  echo ($min_number);
  $array = array_diff($array, array($min_number));
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

  • 解決済

    2種類の配列を元に、複数選択可能なselectボックスを生成する方法は?

    PHPで、下の二つの配列があるとします。 $array1 = array(A,B,C,B); $array2 = array(A,C); HTMLタグを使ってselectボックス

  • 解決済

    php 配列の中身を非表示

    お世話になります。 配列の中身を非表示にする方法はありますでしょうか? やりたいことはif(empty)などで中身がなかった場合に非表示にするみたいなプログラムを実装したいのです

  • 解決済

    PHP:Twigで配列を表示させたい。

    Twigの質問です。 今、PHPで次の配列があるとします。 $arr = array(); $arr[1] = "うさぎ"; $arr[2] = "かめ"; $arr[3] = 

  • 解決済

    PHP 作成した配列を.tsvで出力する方法(コマンドラインにて)

    .tsv/.csv 限定ではないのですが、例えば任意の値変数や配列等ををコマンドライン上でファイルに書き込む方法を知りたいです。

  • 受付中

    PHPの問題

    2010/09/01 2010/10/12 2010/8/2 2010/10/2 2010/5/12 を 2010/09/01 2010/10/12 2010/08/02 20

  • 解決済

    phpエクセルで配列に格納

    お世話になります。 現在、phpExcelを少し勉強しており、わからないことがあるのでご質問させてください。 あるエクセルファイルに店舗情報などが入っており、その中の項目に表示、

  • 解決済

    ソースのダメなところ

    以下のような関数を作りました、なんとなくですがもっと賢く書ける気がします ダメだしなどなど意見、アドバイス頂きたいです function search($src)

  • 解決済

    forとforeachの違い

    基礎的な件で恐縮です。 forとforeachの違いが調べたのですが、 いまいち理解できておりません。 どなたかわかりやすくご教示頂けますと幸いです。 ご面倒を

同じタグがついた質問を見る

  • PHP

    20912questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • teratail

    415questions

    teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。