質問編集履歴

1

すべて

2022/07/05 10:12

投稿

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