前提条件・したい事
- 1~100までの配列の値をランダムに取得します
- 挿入ソートをかけます
- $list[$index] = 50の所で、配列の$index番目に50を追加します
- その後、50以降の数字は、+1されます。
- 最終的に、1 ~ 101までの昇順ソートされます。
問題点
- 30~60までのところで、50 50 50 と、50が並んでしまうときがあります
- 30~60までのところで、47 49 50 50 51 ととびとびになってしまいます。
- 配列の最後の数行のところで、挿入ソートがされなかった数字が出てきます。
- 配列の総数が、0から101までの102個にならない時があります。
php
1<?php 2$list = range(0, 100 , 1); 3 4shuffle($list); 5 6echo 'ソートする配列は'; 7echo '<pre>'; 8var_dump($list); 9echo '</pre>'; 10 11$listCount = count($list); 12$insert = 50; 13 14for($sortcount = 1; $sortcount < $listCount; $sortcount++ ) { 15 16 $tmp = $list[$sortcount]; 17 18 for($index= $sortcount; $index >= 1 && $list[$index - 1] > $tmp; $index--) { 19 20 $list[$index] = $list[$index - 1]; 21 } 22 23 if($list[$index] == $insert){ 24 array_splice($list, $index, 0 , $insert); 25 }else if($list[$index] >= $insert){ 26 $indexMinusOne = $index; 27 $list[$indexMinusOne] = $tmp + 1; 28 }else{ 29 $indexMinusOne = $index; 30 $list[$indexMinusOne] = $tmp; 31 } 32 33} 34 35echo 'ソート完了'; 36echo '<pre>'; 37foreach ($list as $value) { 38 echo $value; 39 echo '<br>'; 40 41} 42echo '配列の総数は、'; 43echo count($list); 44echo '<br>'; 45echo '</pre>'; 46 47?>
試してみたこと
array_splice($list, $index, 0 , $insert);のところの$indexの部分を$index--に変えてみました。
ですが、結果は変わらずでした。
皆様方からのご助言を頂ければと存じます。
お手数ですが、宜しくお願い致します。
yambejp様のご助言により改良したプログラム
yambejp様のコメント
『50の後ろの50を追加するんですから50がだぶるのは必然です。
1~101にするなら50が出現する前の50以上の数値も1加算が必要です』
を参考にして、下記のようにプログラムを作ってみると、うまく動作しました!
array_map()という関数があったんですね。
php
1<?php 2function plus($n){ 3 if($n >= 50){ 4 return ($n + 1); 5 }else{ 6 return $n; 7 } 8} 9//0~100の配列を作成。stepは1 10$list = range(0, 100 , 1); 11//配列をシャッフルする 12shuffle($list); 13 14echo 'ソートする配列は'; 15echo '<pre>'; 16var_dump($list); 17echo '</pre>'; 18 19$listCount = count($list); 20$insert = 50; 21 22$list = array_map('plus', $list); 23array_splice($list, 5, 0 , $insert); 24asort($list); 25foreach ($list as $value) { 26 echo $value; 27 echo '<br>'; 28} 29echo '配列の総数は、'; 30echo count($list); 31echo '<br>'; 32echo '</pre>';
yambejp様、色々とご教授を頂き、誠に感謝いたします。
回答1件
あなたの回答
tips
プレビュー