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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

5630閲覧

大きい順番に並び替えるプログラム

hona_tan

総合スコア45

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/10/14 09:47

なぜ大きい順に並び替えるためにはfor文を二重に書かなければならないのですか?

import java.util.Scanner; public class SortArray { public static void main(String[] args) { int[] data = new int[6]; Scanner str = new Scanner(System.in); for (int i=0; i<data.length; i=i+1) { int kazu = str.nextInt(); data[i] = kazu; } System.out.print("配列dataは、"); for (int i=0; i<data.length; i=i+1) { if (i < 5) { System.out.print(data[i]+ ","); } else { System.out.print(data[i]); } } System.out.println(); for (int i=0; i<data.length; i=i+1) { //大きい順番にする for(int j=0; j<data.length; j=j+1){ if (data[i] < 0) { } else if (data[i] > data[j]) { int a = data[i]; data[i] = data[j]; data[j] = a; } } } int[] order = data; System.out.print("配列orderは、"); for (int i=0; i<order.length; i=i+1) { if (i < 5) { System.out.print(order[i]+ ","); } else { System.out.print(order[i]); } } System.out.println(); } }

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/10/14 10:08

その質問は、「小さい順なら一重ループで書ける」という意図を含んでいますでしょうか?
hona_tan

2020/10/14 10:36

if (data[i] < 0) のことですか?
firegrape

2020/10/14 10:43

変数が2つあったほうが、ロジックが簡単なのでは? 1つでもできると思いますが、複雑になりそうです。 sortは使わないルールなのですね。
Orlofsky

2020/10/14 11:59

> なぜ大きい順に並び替えるためにはfor文を二重に書かなければならないのですか? for文を二重に書かないで効率よく並び替える方法があったら、質問に追記した方が解決が早いかと。
dodox86

2020/10/14 12:55

何でしょう。他人が書いたコードの解説を求められているのでしょうか。ソートを目的としているのであれば必ずしも2重ループにしなくてもアルゴリズムによっては実現できるでしょうが、今、取り沙汰しているコードがバブルソートをもとにしたものっぽいので、バブルソート自体が2重ループを使うから、だけな気がします。
dodox86

2020/10/14 12:57

> 今、取り沙汰しているコードがバブルソートをもとにしたものっぽいので、 本当にバブルソートを参考にしたのであれば、改悪されている部分が見受けられますけれども。
guest

回答2

0

for文は二重にしなくても書けますよ。

Java

1import java.util.Scanner; 2 3public class SortArray { 4 public static void main(String[]args) { 5 Scanner str = new Scanner(System.in); 6 7 int[] data = new int[6]; 8 for (int i = 0; i < data.length; i++) 9 data[i] = str.nextInt(); 10 11 System.out.print("配列dataは、"); 12 for (int i = 0; i < data.length; i++) { 13 if (i != 0) System.out.print(","); 14 System.out.print(data[i]); 15 } 16 System.out.println(); 17 18 for (int i = 0, j = 0; ; ) { 19 if (data[i] < data[j]) { 20 int a = data[i]; data[i] = data[j]; data[j] = a; 21 } 22 if (++j == data.length) { 23 if (++i == data.length) break; 24 j = i; 25 } 26 } 27 28 System.out.print("配列orderは、"); 29 for (int i = 0; i < data.length; i++) { 30 if (i != 0) System.out.print(","); 31 System.out.print(data[i]); 32 } 33 System.out.println(); 34 } 35}

追記
解決済みになりましたが、どのように理解して解釈済みにしたのかを、
回答に対するコメントか、質問への追加かで書いてもらいたいものです。

質問のコードには疑問点があります。

Java

1 if (data[i] < 0) { 2 } else if (data[i] > data[j]) {

なぜ data[i] が負の場合、比較対象にしないのでしょうか?
入力データが全部負の数の場合、ソートは行われません。
正の数と負の数が混ざっている場合、data[j] が負の数なら
比較対象になるので、変なソート結果になることがあります。

それから、この質問のコードはバブルソートではありません。
バブルソートというのは、隣り合う配列要素同士を比較するものです。
data[i] と data[j] は離れています。

選択ソートかというと、そうでもありません。
選択ソートというのは、降順(大きい順)の場合、
data[0]~data[5] の中から最大値を求めて data[0] に入れる。
data[1]~data[5] の中から最大値を求めて data[1] に入れる。
というのを繰り返します。
質問のコードはそうなっていません。

data[0]~data[5] の中から最小値を求めて data[0] に入れる。
data[0]~data[5] の中から最小値を求めて data[1] に入れる。
...
data[0]~data[5] の中から最小値を求めて data[5] に入れる。

結果としてはちゃんとソートされます。

なお、私が書いた for文一つのコードは選択ソートです。

ソートに for文を一つも使わなくて書けることを示します。
while文にするわけではありません。

Java

1import java.util.Scanner; 2 3public class SortArray { 4 static int[] data = new int[6]; 5 6 static void print(String s) { 7 for (int e : data) { System.out.print(s + e); s = ","; } 8 System.out.println(); 9 } 10 11 static void sort(int i, int j) { 12 if (data[i] < data[j]) { 13 int a = data[i]; data[i] = data[j]; data[j] = a; 14 } 15 if (++j < data.length || (j = ++i) < data.length) sort(i, j); 16 } 17 18 public static void main(String[]args) { 19 Scanner sc = new Scanner(System.in); 20 for (int i = 0; i < data.length; i++) data[i] = sc.nextInt(); 21 print("配列dataは、"); 22 sort(0, 0); 23 print("配列orderは、"); 24 } 25}

投稿2020/10/15 03:01

編集2020/10/17 08:28
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

2重で書く必要はありません。

変数を2つ使った方がわかりやすいとは思います。

java

1//for (int i = 0; i < data.length; i = i + 1) { //大きい順番にする 2 for (int j = 0; j < data.length * data.length ; j = j + 1) { 3 if (data[j/data.length] < 0) { 4 } else if (data[j/data.length] > data[j%data.length]) { 5 int a = data[j/data.length]; 6 data[j/data.length] = data[j%data.length]; 7 data[j%data.length] = a; 8 } 9 } 10//} 11

6個の要素から最大値(最小値)を探すには、5回の比較が必要になります。
並べ替えをするので、全要素の最大(最小)を比べる必要があります。
※最大値(最小値)を先頭にしても残りがバラバラでは意味がない

残りの5個から最大値(最小値)を探すには、4回、残りから・・・
と、要素数-1の階乗回数の比較が必要です。(過去質問でバブルソートの比較回数を減らすというのがありましたが)
で、ご提示のロジックでは、バブルソートを少し変えて、要素数の2乗の比較をするようにしています。

ループの外側(内側)が、要素数しか回らないのであれば、2重ループにして比較を増やす必要があります。

投稿2020/10/14 12:08

編集2020/10/15 01:25
momon-ga

総合スコア4826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momon-ga

2020/10/15 01:27 編集

ループ1回だと、配列の中の最大値(最小値)を1つ求められるだけなので、 2重にして、並び替えたあとのモノ以外の中から最大値(最小値)を求めるという感じになります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問