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

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

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

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

Q&A

解決済

2回答

4762閲覧

【JAVA:バブルソート 昇順に並び替える問題の解法】

drinkva

総合スコア5

Java

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

0グッド

0クリップ

投稿2020/03/24 06:16

はじめまして。私はJAVAの初学者です。

配列の学習をする中でバブルソートの問題を解いているところなのですが、あと少しのところで正しく出力できず困っています。
与えられた数を昇順に並び替えるというものです。

僭越ながら、ご教授いただけると幸いです。
よろしくお願いいたします。

JAVA

1public class Main{ 2 public static void main(String[] args){ 3 int[] a ={5,3,2,9,0}; 4 for(int i= 0;i<a.length-1;i++){ 5 for(intj=a.length-1;j>i;j++){ 6 7 if(a[j]>a[j+1]){ 8 int tmp = a[i]; 9 a[i]=a[j]; 10 a[j]=tmp; 11 } 12 } 13 } 14 for(int i:a){ 15 System.out.println(i); 16 17 } 18 } 19} 20

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

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

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

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

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

yureighost

2020/03/24 06:56

まずfor文のintとjを繋いで書いてますが、 これだとそもそもコンパイルエラーになってしまうので離して書いてください。 そしてjをカウンターとして回すfor文でjの初期値がaの配列サイズ5-1で4となってますが、 すぐ下のif文でこのjに1加算して5でa配列にアクセスしようとしてエラーとなっていますね。 またjをインクリメントしてるのもすぐサイズ超過になってしまうので、 恐らくデクリメントしていくのが正しいかと思います。
drinkva

2020/03/25 00:10

yurieghost様、分かりやすい解説をありがとうございました。 6行目を書き換えればよかったのですね。お陰様で解決しました。感涙です!
kazuma-s

2020/03/25 01:21

6行目だけではないでしょう。 質問を編集して、解決したコードを追加していただけないでしょうか?
guest

回答2

0

解決済みだというので、私のコードをお見せします。

Java

1class Bubble { 2 public static void main(String[] args) { 3 int[] a = { 2, 3, 5, 9, 0 }; 4 for (int n = a.length - 1, k, i = 0; i < n; i = k) 5 for (int j = k = n; j > i; j--) 6 if (a[j-1] > a[j]) { 7 int t = a[j-1]; a[j-1] = a[j]; a[j] = t; 8 k = j; 9 } 10 for (int t : a) System.out.print(" " + t); 11 System.out.println(); 12 } 13}

一般的なバブルソートとはちょっと変わっていますよね。
最後に交換を行った場所を k に憶えておくと、それより前はソート済みなので、
i を 1ずつ増やすのではなく、もっと進めることができます。
配列が最初からソート済みだった場合、配列の走査(j の forループ)は 1回で済みます。

投稿2020/03/25 01:27

kazuma-s

総合スコア8224

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

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

0

ベストアンサー

真面目に見て、指摘事項をコメントで追記しました。

java

1public class Main{ 2 public static void main(String[] args){ 3 int[] a ={5,3,2,9,0}; 4 for(int i= 0;i<a.length-1;i++){ 5 for(intj=a.length-1;j>i;j++){ //intとjの間にスペースが無い、jをインクリメントすると配列の範囲外 6 if(a[j]>a[j+1]){ // ここもj+1だと配列の範囲外 7 int tmp = a[i]; // 上のif分で比較はa[j]とその隣の値で比較してるのに、tmpに退避する値はa[i]? 8 a[i]=a[j]; // バブルソートは配列内の隣り合った値を入れ替えてソートをする手法ですが、これだと隣り合った値にはならない 9 a[j]=tmp; 10 } 11 } 12 } 13 for(int i:a){ 14 System.out.println(i); 15 } 16 }

投稿2020/03/24 06:43

編集2020/03/24 07:46
kaina

総合スコア418

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

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

yureighost

2020/03/24 07:02

javaでは配列は参照渡しになるので、if文内で書き換えることで変更されますよ。
kaina

2020/03/24 07:36

すいません、printlnのところは問題ありませんでしたね。 指摘箇所も中途半端な内容なので、追記します。
drinkva

2020/03/24 23:55

kaina様、yureighost様、ご指摘くださりありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問