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

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

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

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

スレッドセーフ

マルチスレッド環境において、複数のスレッド上で常に正常に実行する事が可能なコードを、スレッドセーフなコードと呼びます。

ソート

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

Q&A

解決済

2回答

2628閲覧

ソート部分のスレッドが終わりません

aptsin

総合スコア8

Java

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

スレッドセーフ

マルチスレッド環境において、複数のスレッド上で常に正常に実行する事が可能なコードを、スレッドセーフなコードと呼びます。

ソート

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

0グッド

0クリップ

投稿2018/07/09 04:23

編集2018/07/09 04:50

前提・実現したいこと

バブルソート、クイックソートのスレッドを実行するプログラムを作成したいです。
データはランダムに生成してそれを並び替えようとしています。

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

バブルソートもクイックソートもスレッド終了のメッセージが出てきません
クイックの方は
int n2[] = quickSort(n);
に対して、未定義だとエラーが出ています。
どう直せばいいのでしょうか??

該当のソースコード

import java.io.*; import java.util.Random; import java.util.LinkedList; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; class babble extends Thread{ //コンストラクタ babble(int[] n){ //バブル System.out.println("バブルソートスタート"); } public void run(int[] n){ int count=0; for (int j = 0; j < n.length; j++) { for(int k = n.length-1; k>j; k-- ){ if (n[k - 1] > n[k]) { int t = n[k - 1]; n[k - 1] = n[k]; n[k] = t; count++; } } } System.out.println("バブルソート終了"); for(int f = 0; f< n.length;f++){ System.out.printf("%d ",n[f]); } } } class quick extends Thread{ quick(int[] n){ System.out.println("クイックソートスタート"); } public void run(int[] n){ //コンストラクタ LinkedList<Integer> list = new LinkedList<>(); n = new int[list.size()]; //listに格納したデータを配列dataに格納 for(int y = 0; y < list.size(); y++){ n[y] = list.get(y); } //クイック int n2[] = quickSort(n); System.out.println("クイックソート終了"); } } public class sort { public static void main(String[] args){ try{ System.out.print("発生するデータ数:"); BufferedReader a = new BufferedReader (new InputStreamReader(System.in)); String str; //標準入力から読み込んだ文字列を格納 str = a.readLine(); int x = Integer.parseInt(str); //実数に変換 //Randomクラスの生成 Random rnd = new Random(); int[] n = new int[x]; for (int i=0; i<n.length; i++){ n[i] = i/100+1; } //シャッフル for(int i = n.length-1; i>0; i--){ int index = (int)(Math.random()*(i+1)); if (index == i) continue; int temp = n[i]; n[i] = n[index]; n[index] = temp; } babble b = new babble(n); b.start(); quick q = new quick(n); q.start(); b.join(); q.join(); }catch(InterruptedException | IOException e){ System.out.println(e); } } public static int[] quickSort(int[] n){ //クイックソート return quick(n, 0, n.length-1); } private static int[] quick(int[] n, int left, int right){ int[] array = n; int currentLeft = left; int currentRight = right; //要素数が1以下の時はなにもせずに返却 if (array.length < 2){ return array; } int pivot = array[(currentLeft + currentRight) / 2]; do{ while(array[currentLeft] < pivot){ currentLeft++; } while(array[currentRight] > pivot){ currentRight--; } if(currentLeft <= currentRight){ int index1 = currentLeft++; int index2 = currentRight--; int temp = array[index1]; array[index1] = array[index2]; array[index2] = temp; } }while(currentLeft <= currentRight); if(left < currentRight){ quick(array, left, currentRight); } if(currentLeft < right){ quick(array, currentLeft, right); } return array; } } ```java

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

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

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

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

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

m.ts10806

2018/07/09 04:32

質問テンプレート部分の文言が多く残っています。質問内容や意図を読み取る上ではノイズにしかなりませんので、自身の質問に関係のある文章(およびソースコード)のみ残すか、きちんと残りのテンプレート部分を埋めてください。
unz.hori

2018/07/09 04:32

使っているJavaのバージョンは何でしょうか?
m.ts10806

2018/07/09 04:33

### 該当のソースコード はあくまで見出しです。コード部分は ``` [改行] [コード]``` [改行] のように記載します。冒頭を```java のようにすると言語にあわせてコードハイライトしてくれます。(少しその部分が残っていますが、調整してください)
aptsin

2018/07/09 04:38

Eclipseを使っています
unz.hori

2018/07/09 04:39

回答になってないですね。Eclipseは開発ツールでJavaのバージョンではありません
m.ts10806

2018/07/09 04:42

質問内容が悪化してしまった。PCでは質問編集画面ではリアルタイムプレビューが表示されているのでそちらを確認して調整してから投稿してください。
aptsin

2018/07/09 04:42

すみませんでした。Java SE 9です。
unz.hori

2018/07/09 04:54

ちょっと本筋とは関係ないところで突っ込みどころが...。クラス名は基本大文字始まりが正しい。quickSortメソッド、quickメソッドはsortクラスではなくquickクラスに存在するのが正しい。
unz.hori

2018/07/09 05:16

デバッグに関するTipsを少々。問題点が絞りにくくなるためソート2方式の処理が書かれているがソースをシンプルにしてデバックすべき。スレッド内の処理にブレークポイントを貼って各処理で使用する変数の状態を確認するべし。ブレークポイントが活用できない場合は標準出力に内容を出力して確認する。プログラム実行時にソート対象の要素数を入力させているが問題の本質とは関係ないので固定値でTry & Errorを行うほうが効率が良い。
guest

回答2

0

ベストアンサー

コンパイル通してませんが、コードをみて気づいた点を。

a. Threadクラスを継承(extends)するときは、runメソッドをオーバーロード(オーバーライドではないです)しないでください。これが質問文のスレッド終了のメッセージが出ない原因です。

diff

1-public void run(int[] n){ 2+public void run(){

b. quick クラス、babbleクラスともにコンストラクタで渡された引数nを無視しています。

Java

1 quick(int[] n){ // 引数 nに対して以下ブロックで何もしていない。 2 System.out.println("クイックソートスタート"); 3 }

クラスにインスタンス変数を宣言し値を設定してください。
あと変数:Nは数字と誤解されやすい変数命名なため、別の変数名:dataなどにしてください。

Java

1 private final int[] data; // finalで宣言すること。 2 quick(int[] n){ // 引数 nに対して以下ブロックで何もしていない。 3 System.out.println("クイックソートスタート"); 4 this.data = n; 5 }

c. babbleクラスとquickクラスに同じ変数nを参照しています。スレッド間でのデータ競合が起こるため、n.clone()でコピーするか、Arrays.copyOfを行ってください。よーするに複数スレッドから同じ変数に対して、排他制御(ロック)をしないで、変更してはダメということです。

Java

1babble b = new babble(n); 2b.start(); 3 4quick q = new quick(n); 5q.start();

Java

1babble b = new babble(n.clone()); 2//中略 3quick q = new quick(n.clone()); 4//もしくはbabbleクラスquickクラスのコンストラクタ内で引数に対してclone()を呼び出す。

ここから余談です。
d. 以下のシャッフル部分はCollections#shuffleが使えます。

Java

1 //シャッフル 2 for(int i = n.length-1; i>0; i--){ 3 int index = (int)(Math.random()*(i+1)); 4 if (index == i) continue; 5 int temp = n[i]; 6 n[i] = n[index]; 7 n[index] = temp; 8 } 9

e. pivot値の選択がオーバーフローする可能性があります。これはある整数値の範囲を表すのに、符号付きの数値型だとその範囲を表せないというのが原因です。

diff

1-int pivot = array[(currentLeft + currentRight) / 2]; 2+int pivot = array[currentLeft + ((currentRight- currentLeft) / 2)];

◇参考情報
Extra, Extra - Read All About It: Nearly All Binary Searches and Mergesorts are Broken

f. private static int[] quick(int[] n, int left, int right){ で再帰呼出しを行っていますが、多分大丈夫だと思いますが、スタック・オーバーフローする可能性があるので、再帰呼出しは避けたほうが無難です。
※データ数によって実行時エラーが発生する可能性があるプログラムは個人的に好きではないというのがあります。

投稿2018/07/09 05:07

編集2018/07/09 10:09
umyu

総合スコア5846

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

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

aptsin

2018/07/10 07:12

ありがとうございました。
guest

0

int n2[] = quickSort(n);

に対して、未定義だとエラーが出ています。

↑「quickSort」は「sort」クラスのメソッドであって、「quick」クラスのメソッドではないので、この書き方では参照できません。

//クイック int n2[] = sort.quickSort(n);

↑書くならこう。

バブルソートもクイックソートもスレッド終了のメッセージが出てきません

↑そもそもコンパイルエラーになるはずなので、「メッセージが出てこない」なんて状態以前の問題ですが。

投稿2018/07/09 05:00

tkturbo

総合スコア5572

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問