前提・実現したいこと
ボタンを押すと、クイックソートでデータのスワップをして、再描画して少し止まるようにアニメーション化するプログラムを作成したいです。
発生している問題
ボタンを押して、再描画できるプログラムを作成することまではできたのですが、クイックソートされませんでした。
クイックソートのコードに誤りはないと思ったのですが、どこが誤っているのでしょうか?
該当のソースコード
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
コンパイラは、コマンドプロンプト
回答1件
あなたの回答
tips
プレビュー