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

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

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

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

ソート

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

Q&A

解決済

1回答

614閲覧

クイックソートでデータのスワップをしたあと、再描画して少し止まるようにアニメーション化する

takumi-33

総合スコア19

Java

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

ソート

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

0グッド

0クリップ

投稿2021/07/04 05:51

編集2021/07/04 06:38

前提・実現したいこと

ボタンを押すと、クイックソートでデータのスワップをして、再描画して少し止まるようにアニメーション化するプログラムを作成したいです。

発生している問題

ボタンを押して、再描画できるプログラムを作成することまではできたのですが、クイックソートされませんでした。
クイックソートのコードに誤りはないと思ったのですが、どこが誤っているのでしょうか?

該当のソースコード

java

1import javax.swing.*; 2import java.awt.*; 3import java.awt.event.*; 4 5public class QuickSort1 extends JPanel implements Runnable, ActionListener { 6 /* フィールドは、ほとんど BubbleSort1 と同じ */ 7 private int[] args = new int[12]; 8 private final Color[] cs = { Color.RED, Color.ORANGE, Color.GREEN, Color.BLUE }; 9 private volatile Thread thread = null; 10 private int i, j; 11 12 private volatile boolean threadSuspended = true; /* 追加のフィールド */ 13 14 public QuickSort1() { 15 setPreferredSize(new Dimension(320, 250)); 16 JButton step = new JButton("Step"); 17 step.addActionListener(this); 18 setLayout(new FlowLayout()); 19 add(step); 20 startThread(); 21 } 22 23 /* startTread は BubbleSort1 と同じ */ 24 private void startThread() { 25 if (thread == null) { 26 thread = new Thread(this); 27 thread.start(); 28 } 29 } 30 31 public void swap(int[] v, int i, int j) { 32 int tmp = v[i]; 33 v[i] = v[j]; 34 v[j] = tmp; 35 } 36 37 public void qsort(int[] v, int left, int right) { 38 if (left >= right) 39 return; 40 int i = left, j = right; 41 int pivot = v[i + (j - i) / 2]; 42 while (true) { 43 while (v[i] < pivot) 44 i++; 45 while (pivot < v[j]) 46 j--; 47 if (i >= j) 48 break; 49 swap(v, i, j); 50 i++; 51 j--; 52 } 53 qsort(v, left, i - 1); 54 qsort(v, j + 1, right); 55 } 56 57 public void run() { 58 while (true) { 59 prepareRandomData(); 60 // クイックソートのアルゴリズム 61 qsort(args, args[0], args[args.length - 1]); 62 repaint(); 63 /* repaint の後で止まる */ 64 try { 65 synchronized (this) { 66 while (threadSuspended) { 67 wait(); 68 } 69 threadSuspended = true; 70 } 71 } catch (InterruptedException e) { 72 } 73 } 74 } 75 76 public synchronized void actionPerformed(ActionEvent e) { 77 threadSuspended = false; 78 notify(); 79 } 80 /* paintComponent, main などは BubbleSort1 と同じ */ 81 82 @Override 83 public void paintComponent(Graphics g) { 84 int k; 85 86 super.paintComponent(g); 87 g.setColor(Color.YELLOW); 88 g.fillOval(5, 50 + j * 10, 10, 10); 89 g.setColor(Color.CYAN); 90 g.fillOval(5, 50 + i * 10, 10, 10); 91 for (k = 0; k < args.length; k++) { 92 g.setColor(cs[k % cs.length]); 93 g.fillRect(20, 50 + k * 10, args[k] * 5, 10); 94 } 95 } 96 97 private void prepareRandomData() { 98 int len = args.length; 99 for (int k = 0; k < len; k++) { 100 args[k] = (int) (Math.random() * 10); // 適当な範囲の乱数 101 } 102 } 103 104 public static void main(String[] args) { 105 SwingUtilities.invokeLater(() -> { 106 JFrame frame = new JFrame("クイックソート"); 107 frame.add(new QuickSort1()); 108 frame.pack(); 109 frame.setVisible(true); 110 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 111 }); 112 } 113}

試したこと

クイックソートのプログラムの検索。
バブルソートで再描画するプログラムを参考にすること。

補足情報(FW/ツールのバージョンなど)

エディタは、VScode
コンパイラは、コマンドプロンプト

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

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

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

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

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

1T2R3M4

2021/07/04 05:58

>エラーコードを検索すること 検索しただけなんでしょうか。
takumi-33

2021/07/04 06:30

検索して、解決までしていました。 ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

最初の qsort の呼び出しが間違っているのではありませんか?

diff

1- qsort(args, args[0], args[args.length - 1]); 2+ qsort(args, 0, args.length - 1);

追記

データのスワップをしたあと、再描画して少し止まるようにアニメーション化する

swap のあとに repaint すればいいのではありませんか?

Java

1import javax.swing.*; 2import java.awt.*; 3import java.awt.event.*; 4 5public class QuickSort1 extends JPanel implements Runnable, ActionListener { 6 /* フィールドは、ほとんど BubbleSort1 と同じ */ 7 private int[] args = new int[18]; 8 private final Color[] cs = { Color.RED, Color.ORANGE, Color.GREEN, Color.BLUE }; 9 private volatile Thread thread = null; 10 private int i, j; 11 12 private volatile boolean threadSuspended = true; /* 追加のフィールド */ 13 14 public QuickSort1() { 15 setPreferredSize(new Dimension(320, 250)); 16 JButton step = new JButton("Step"); 17 step.addActionListener(this); 18 setLayout(new FlowLayout()); 19 add(step); 20 startThread(); 21 } 22 23 /* startTread は BubbleSort1 と同じ */ 24 private void startThread() { 25 if (thread == null) { 26 thread = new Thread(this); 27 thread.start(); 28 } 29 } 30 31 public void swap(int[] v, int i, int j) { 32 int tmp = v[i]; 33 v[i] = v[j]; 34 v[j] = tmp; 35 } 36 37 public void qsort(int[] v, int left, int right) { 38 if (left >= right) 39 return; 40 int i = left, j = right; 41 int pivot = v[i + (j - i) / 2]; 42 while (true) { 43 while (v[i] < pivot) 44 i++; 45 while (pivot < v[j]) 46 j--; 47 if (i >= j) 48 break; 49 swap(v, i, j); 50 repaint(); 51 /* repaint の後で止まる */ 52 try { 53 synchronized (this) { 54 while (threadSuspended) { 55 wait(); 56 } 57 threadSuspended = true; 58 } 59 } catch (InterruptedException e) { 60 } 61 //try { Thread.sleep(400); } catch (InterruptedException e) {} 62 i++; 63 j--; 64 } 65 qsort(v, left, i - 1); 66 qsort(v, j + 1, right); 67 } 68 69 public void run() { 70 while (true) { 71 prepareRandomData(); 72 // クイックソートのアルゴリズム 73 //qsort(args, args[0], args[args.length - 1]); 74 qsort(args, 0, args.length - 1); 75 repaint(); 76 /* repaint の後で止まる */ 77 try { 78 synchronized (this) { 79 while (threadSuspended) { 80 wait(); 81 } 82 threadSuspended = true; 83 } 84 } catch (InterruptedException e) { 85 } 86 } 87 } 88 89 public synchronized void actionPerformed(ActionEvent e) { 90 threadSuspended = false; 91 notify(); 92 } 93 /* paintComponent, main などは BubbleSort1 と同じ */ 94 95 @Override 96 public void paintComponent(Graphics g) { 97 int k; 98 99 super.paintComponent(g); 100 g.setColor(Color.YELLOW); 101 g.fillOval(5, 50 + j * 10, 10, 10); 102 g.setColor(Color.CYAN); 103 g.fillOval(5, 50 + i * 10, 10, 10); 104 for (k = 0; k < args.length; k++) { 105 g.setColor(cs[k % cs.length]); 106 g.fillRect(20, 50 + k * 10, args[k] * 5, 10); 107 } 108 } 109 110 private void prepareRandomData() { 111 int len = args.length; 112 for (int k = 0; k < len; k++) { 113 args[k] = (int) (Math.random() * 50); // 適当な範囲の乱数 114 } 115 } 116 117 public static void main(String[] args) { 118 SwingUtilities.invokeLater(() -> { 119 JFrame frame = new JFrame("クイックソート"); 120 frame.add(new QuickSort1()); 121 frame.pack(); 122 frame.setVisible(true); 123 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 124 }); 125 } 126}

投稿2021/07/05 02:15

編集2021/07/05 04:32
kazuma-s

総合スコア8224

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

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

takumi-33

2021/07/06 02:19

呼び出しが間違っていました!ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問