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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

2240閲覧

javaでString型の配列を非再帰型のクイックソートで整列するプログラムを作成したい

ayataka451

総合スコア6

Java

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/06/21 09:52

前提・実現したいこと

javaでString型の配列を非再帰型のクイックソートで整列するプログラムを作成したいです。
”Javaプログラマのためのアルゴリズムとデータ構造”を参考にプログラムを作成したのですが、実行したところ処理が終わらず正しい実行結果が得られません。

発生している問題・エラーメッセージ

処理が終わらず、結果が表示されません

該当のソースコード

Java

1 2class QuickSortTest{ 3 private static int partition(String[] a, int left, int right){ 4 //ポインタi,jを初期化 5 int i = left-1; 6 int j = right; 7 //右端の要素を枢軸に 8 String privot = a[right]; 9 //ポインタiとjがぶつかるまで繰り返す 10 while (true) { 11 //ポインタiを右に進める 12 int check = a[++i].compareTo(privot); 13 while (check < 0) 14 i++; 15 check = a[i].compareTo(privot); 16 //ポインタjを左に進める 17 int check2 = privot.compareTo(a[j]); 18 while (i < --j && check2 < 0) 19 j--; 20 check2 = privot.compareTo(a[j]); 21 //ポインタiとjがぶつかったらループを抜ける 22 if (i >= j) 23 break; 24 //iのさす要素とjのさす要素を交換する 25 String temp = a[i]; 26 a[i] = a[j]; 27 a[j] = temp; 28 } 29 //targetArray[i]と枢軸を交換する 30 String temp = a[i]; 31 a[i] = a[right]; 32 a[right] = temp; 33 return i; 34 } 35 36 public static void Sort(String[] a) { 37 int n = a.length; 38 int[] low = new int[30]; 39 int[] high = new int[30]; 40 int sp; 41 //スタックを初期化 42 low[0] = 0; 43 high[0] = n-1; 44 sp = 1; 45 //スタックが空になるまで繰り返す 46 while (sp > 0) { 47 //スタックから整列する範囲を取り出す 48 int left = low[--sp]; 49 int right = high[sp]; 50 51 //整列する要素が一つなら何もしない 52 // (再びWhile文を実行) 53 if (left >= right) { 54 //何もしない 55 } else{ 56 //枢軸vを基準に分割する 57 int v = partition(a,left,right); 58 59 //左右の部分配列のうち、短いほうを先に処理する 60 if (v - left < right - v) { 61 //左部分配列を先に整列する 62 //(スタックなので「右左」の順に積むことに注意) 63 low[sp] = v + 1; 64 high[sp++] = right; 65 low[sp] = left; 66 high[sp++] = v - 1; 67 } else { 68 //右部分配列を先に整列する 69 //(スタックなので「左右」の順に積むことに注意) 70 low[sp] = left; 71 high[sp++] = v - 1; 72 low[sp] = v + 1; 73 high[sp++] = right; 74 } 75 } 76 } 77 } 78 79 public static void main(String[] args) { 80 String[] a = new String[5] ; 81 a[0] = "January"; 82 a[1] = "February"; 83 a[2] = "March"; 84 a[3] = "April"; 85 a[4] = "May"; 86 QuickSortTest.Sort(a) ; 87 for (int i = 0 ; i < a.length ; i++) { 88 System.out.println("[" + i + "]:" + a[i]) ; 89 } 90 } 91 92} 93 94 95### 試したこと 96 97partitionメソッド内の a[i].compareTo(privot)、privot.compareTo(a[j])と i++、j--などの処理を行う位置を変更したり、処理内容を変更してみたのですが、いずれも処理は終わらず、正しい実行結果を得ることはできませんでした。 98 99### 補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

swordone

2018/06/21 12:47

コードのマークダウン、閉じる```が無いので追加してください。
kei344

2018/06/21 16:09

質問タグにある「JavaScript」は無関係ではないでしょうか。
guest

回答1

0

java

1while (true) { 2 //ポインタiを右に進める 3 int check = a[++i].compareTo(privot); 4 while (check < 0) 5 i++; 6 check = a[i].compareTo(privot); 7 //ポインタjを左に進める 8 int check2 = privot.compareTo(a[j]); 9 while (i < --j && check2 < 0) 10 j--; 11 check2 = privot.compareTo(a[j]); 12 //ポインタiとjがぶつかったらループを抜ける 13 if (i >= j) 14 break; 15 //iのさす要素とjのさす要素を交換する 16 String temp = a[i]; 17 a[i] = a[j]; 18 a[j] = temp; 19}

partitionメソッド内のwhileループを抜き出し、インデントを入れました。原因は「ポインタiを右にずらす」のところにあるwhileループです。
whileに中括弧がないため、ループして実行する対象の文はi++のみです。whileの継続条件に関わるcheckは一切変化しないため、一度入ったら抜け出せなくなります。なお、この後にあるjをずらす処理も同様に、無限ループの書き方になっています。

投稿2018/06/21 23:33

swordone

総合スコア20651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問