- ベストアンサー
ソート
お世話になります。配列のソートなのですが、どうも思い通りの結果になりません。 配列の中から最大値と最小値を探し、最小値を配列0に、最大値を配列の最後に移動します。その2つ以外の数字の順番は変えません。 例) {4,3,2,0,1,2} 最小値は0、最大値は4なので→{0,3,2,1,2,4} {4,3,2,1} → {1,3,2,4} {1,3,2,4,} → {1,3,2,4} 流れとしては、まず最小値を求め配列0に移動させ、次に最大値を求め配列の最後に移動させようと思います。 プログラムは以下のように組みました。 public int[] sortOfSort(int[] array) { int count_min = 0; int min = array[0]; for (int i = 0; i < array.length-1; i++) { // 最小値を求める if (min > array[i + 1]) { min = array[i + 1]; count_min++; // 最小値の配列のインデックスを確保 } } for (int k = count_min; k > 0; k--) { // 最小値の移動 int temp_min = array[k - 1]; array[k - 1] = array[k]; array[k] = temp_min; } int count_max = 0; int max = array[0]; for (int j = 0; j < array.length-1; j++) { // 最大値を求める if (max < array[j + 1]) { max = array[j + 1]; count_max++; // 最大値の配列のインデックスを確保 } } for (int l = count_max; l < array.length-1; l++) { //最大値の移動 int temp_max = array[l + 1]; array[l + 1] = array[l]; array[l] = temp_max; } return array; } 間違っているところがわかりましたら宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
お疲れ様です。 まずfor文を4回も使ってしまってますね。 私なら性能を考えてまず、最小値・最大値を探すために1回。 そして配列に設定しなおすために1回。 でfor文2回で済ませますね。 参考例としてあげておきます。 public int[] sortOfSort(int[] array) { int min = array[0]; int max = array[0]; int min_index = 0; int max_index = 0; for(int i=0; i<array.length; i++) { if (min > array[i]) { min = array[i]; min_index = i; } if (max < array[i]) { max = array[i]; max_index = i; } } int[] new_array = new int[array.length]; new_array[0] = min; new_array[array.length-1] = max; int count = 1; for(int i=0; i<array.length; i++) { if (min_index != i && max_index != i) { new_array[count] = array[i]; count++; } } return new_array; }
その他の回答 (2)
- askaaska
- ベストアンサー率35% (1455/4149)
どこまでは正しく動いているか は把握しているのかな? 使えるならデバッガ 使えないならSystem.out.printを駆使して まずはどこまで正しく動いているのかを 確認してみよう。 そうすればcount_minとcount_maxの値が 想定しているのと全く違うことに気づくはず。 もうちょっとHINTあげると 最初のforループ for (int i = 0; i < array.length-1; i++) { // 最小値を求める if (min > array[i + 1]) { min = array[i + 1]; count_min++; // 最小値の配列のインデックスを確保 } } 変数iは配列のインデックスだよね。 count_minの値はiとは一緒に増加しないのはわかるかな? 蛇足だけど 最大値と最小値の検索は forループ1回でできるよ。
お礼
>count_minの値はiとは一緒に増加しないのはわかるかな? 確かにその通りですね。if文から出さなければいけませんでした・・・。 動作確認しながらまたやってみます!ありがとうございました!
- salsberry
- ベストアンサー率69% (495/711)
思った通りの結果にならないのは「最小値および最大値がどこに入っているかを覚えておく方法が間違っている」のが原因です。
お礼
その通りでした。ありがとうございます!
お礼
確かにfor文一回で最小値最大値求めるほうが賢いですね! 新しく配列を定義して入れていったほうがやりやすいです!ありがとうございました!