前提・実現したいこと
お世話になります。
ArrayListに格納した数値をクイックソートで昇順にソートしたいです。
List内の一番左の数値をピボットとして数値を比較し、それを再起的に繰り返す事でソートしようとしたのですがエラーが出てしまいます。
発生している問題・エラーメッセージ
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0 at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) at java.base/java.util.Objects.checkIndex(Objects.java:373) at java.base/java.util.ArrayList.get(ArrayList.java:426) at Quick.Quick(Quick.java:24) at Quick.Quick(Quick.java:35)
該当のソースコード
java
1public class QuickSort { 2 3 ArrayList<Integer> array = new ArrayList<Integer>(); 4 5 //クイックソート 6 void Quick(ArrayList<Integer> array) { 7 int size = array.size(); 8 9 //listの大きさが1なら再帰終了 10 if (size == 1) return; 11 12 ArrayList<Integer> L = new ArrayList<>(), R = new ArrayList<>(); 13 14 //一番左の値をピボットとして分割処理 15 int P = array.get(0); 16 for (int i=1; i<size; i++) { 17 if (P > array.get(i)) { 18 L.add(array.get(i)); 19 }else { 20 R.add(array.get(i)); 21 } 22 } 23 24 //再帰 25 Quick(L); 26 Quick(R); 27 28 array.clear(); 29 30 //分割した値を統合 31 for (int i=0; i<L.size(); i++) { 32 array.add(L.get(i)); 33 } 34 35 array.add(P); 36 37 for (int i=0; i<R.size(); i++) { 38 array.add(R.get(i)); 39 } 40 } 41}
『Quick』と『Quick1』が混在しているように見えますが、これは意図的ですか?
array1 は何者でしょうか? 宣言もなしにいきなりコード上に現れます。
すみません。こちらのミスです。
クラス名と同じ名前のメソッド名は・・・・
質問用に実際の名前と変更して書いています。困惑させてしまい申し訳ないです。修正しました。
質問用に変数名を変更する意図が分かりません。
クラス名に私的な名称が入っていたのでその部分を省きました。
なるほど。確かにそれならば変更した方が良いでしょうね。
質問を投稿する際は、投稿するコードが元のコードと同じように振る舞うかどうか確認しておくとスムーズかも思います。
元のコードと同じような振る舞いをするのは重要ですね。以後投稿の際に気をつけます。
回答4件
あなたの回答
tips
プレビュー