Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.93 KB | None | 0 0
  1. package com.company;
  2.  
  3. import javax.swing.*;
  4. import java.awt.*;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.util.Arrays;
  8. import java.util.Collections;
  9.  
  10. public class Sorting extends JPanel {
  11. //Количество элементов
  12. private static final int NUM_ITEMS = 50;
  13.  
  14. //Панель для отрисовки массивов
  15. private JPanel panelBooble , panelInsert;
  16. //Кнопка старта и сброса
  17. private JButton startButton , resetButton;
  18. //Объекты внутреннего цикла
  19. private Timer timerBooble, timerInsert;
  20. //Объекты внешнего цикла
  21. private Thread thBooble , thInsert;
  22. //Массивы для сортировки
  23. private Integer[] arrayBooble, arrayInsert;
  24. //Переменные счетчики для сортировки вставками
  25. private int indexInsertI ,indexInserJ , temp;
  26. //Переменные счечтики для сортировки пузырьком
  27. private int indexBoobleI , indexBoobleJ;
  28. //Флаги
  29. private boolean bBooble , stopFlagBooble , bInser , stopFlagInsert;
  30.  
  31. //Конструктор
  32. public Sorting(){
  33. //Установка Layout
  34. setLayout(new BorderLayout());
  35.  
  36. //Инициализация массивов
  37. arrayBooble = initArray();
  38. arrayInsert = Arrays.copyOf(arrayBooble , NUM_ITEMS);
  39.  
  40. //Инициализация Timer "внутреннего цикла"
  41. timerBooble = new Timer(25, new ActionListener() {
  42. @Override
  43. public void actionPerformed(ActionEvent e) {
  44. //Проверка что внутрений цикл дошел до конца
  45. if (indexBoobleJ >= indexBoobleI-1) {
  46. bBooble = true;
  47. synchronized (thBooble){
  48. //Разрешаем внешнему циклу продолжить работу
  49. thBooble.notify();
  50. }
  51. //Останавливаем таймер
  52. ((Timer) e.getSource()).stop();
  53. }
  54. //Проверяем рядом стоящие элементы и меняем их местами если условие выполняется
  55. if (arrayBooble[indexBoobleJ] > arrayBooble[indexBoobleJ + 1]) {
  56. int booble = arrayBooble[indexBoobleJ];
  57. arrayBooble[indexBoobleJ] = arrayBooble[indexBoobleJ + 1];
  58. arrayBooble[indexBoobleJ + 1] = booble;
  59. panelBooble.repaint();
  60. }
  61. //Увеличиваем счетчик внутреннего цикла на 1
  62. indexBoobleJ++;
  63. }
  64. });
  65.  
  66. //Инициализация Timer "внутреннего цикла"
  67. timerInsert = new Timer(25, new ActionListener() {
  68. @Override
  69. public void actionPerformed(ActionEvent e) {
  70. //Проверка что внутрений цикл дошел до конца
  71. if (indexInserJ < 0 || arrayInsert[indexInserJ] < temp) {
  72. bInser = true;
  73. synchronized (thInsert){
  74. //Разрешаем внешнему циклу продолжить работу
  75. thInsert.notify();
  76. }
  77. //Останавливаем таймер
  78. ((Timer) e.getSource()).stop();
  79. }else {
  80. //Перезаписываем элемент
  81. arrayInsert[indexInserJ + 1] = arrayInsert[indexInserJ];
  82. panelInsert.repaint();
  83. indexInserJ--;
  84. }
  85. }
  86. });
  87.  
  88. //Инициализация кнопки старта сортировки
  89. startButton = new JButton("Start");
  90. startButton.addActionListener(new ActionListener() {
  91. @Override
  92. public void actionPerformed(ActionEvent e) {
  93. //Обнуляем флаги
  94. stopFlagInsert = false;
  95. stopFlagBooble = false;
  96. //Инициализируем счетчик для пузырьковой сортировки
  97. indexBoobleI = NUM_ITEMS - 1;
  98. //Инициализируем счетчик для сортировки вставками
  99. indexInsertI = 1;
  100. //Инициализируем поток внешнего цикла
  101. thBooble = new Thread(new Runnable() {
  102. @Override
  103. public void run() {
  104. while(!stopFlagBooble) {
  105. try {
  106. //Завершаем поток после того как массив отсортирован
  107. if (indexBoobleI <= 1) {
  108. stopFlagBooble = true;
  109. }
  110. //Переменная счетчик внутреннего цикла
  111. indexBoobleJ = 0;
  112. bBooble = false;
  113. //Запускаем работу внутреннего цикла
  114. timerBooble.start();
  115. synchronized (thBooble) {
  116. while (!bBooble) {
  117. //Ожидаем пока внутренний цикл завершит работу
  118. thBooble.wait();
  119. }
  120. }
  121. indexBoobleI--;
  122. } catch (Exception ex) {
  123. ex.getStackTrace();
  124. }
  125. }
  126. }
  127. });
  128. //Инициализируем поток внешнего цикла
  129. thInsert = new Thread(new Runnable() {
  130. @Override
  131. public void run() {
  132. while(!stopFlagInsert) {
  133. try {
  134. //Завершаем поток после того как массив отсортирован
  135. if (indexInsertI >= NUM_ITEMS) {
  136. stopFlagInsert = true;
  137. }
  138. temp = arrayInsert[indexInsertI];
  139. indexInserJ = indexInsertI - 1;
  140. bInser = false;
  141. //Запускаем работу внутреннего цикла
  142. timerInsert.start();
  143. synchronized (thInsert) {
  144. while (!bInser) {
  145. //Ожидаем пока внутренний цикл завершит работу
  146. thInsert.wait();
  147. }
  148. }
  149. arrayInsert[indexInserJ + 1] = temp;
  150. panelInsert.repaint();
  151. indexInsertI++;
  152. } catch (Exception ex) {
  153. ex.getStackTrace();
  154. }
  155. }
  156. }
  157. });
  158. //Запускаем потоки
  159. thBooble.start();
  160. thInsert.start();
  161. }
  162. });
  163. //Сбросить
  164. resetButton = new JButton("Reset");
  165. resetButton.addActionListener(new ActionListener() {
  166. @Override
  167. public void actionPerformed(ActionEvent e) {
  168. stopFlagBooble = true;
  169. stopFlagInsert = true;
  170. arrayBooble = initArray();
  171. arrayInsert = Arrays.copyOf(arrayBooble , NUM_ITEMS);
  172. panelInsert.repaint();
  173. panelBooble.repaint();
  174. }
  175. });
  176.  
  177. //Панель для отрисовки массива алгоритма пузырьковой сортировки
  178. panelBooble = new JPanel(){
  179. @Override
  180. protected void paintComponent(Graphics g) {
  181. super.paintComponent(g);
  182. int heightItem = panelBooble.getHeight()/NUM_ITEMS;
  183. int widthItem = (panelBooble.getWidth()/NUM_ITEMS);
  184. for(int i = 0; i < NUM_ITEMS; i++){
  185. int height = arrayBooble[i]*heightItem;
  186. int x = i * widthItem;
  187. g.drawRect(x , panelBooble.getHeight()-height , widthItem , height);
  188. }
  189. }
  190. };
  191.  
  192. //Панель для отрисовки массива алгоритма сортировки вставками
  193. panelInsert = new JPanel(){
  194. @Override
  195. protected void paintComponent(Graphics g) {
  196. super.paintComponent(g);
  197. int heightItem = panelInsert.getHeight()/NUM_ITEMS;
  198. int widthItem = (panelInsert.getWidth()/NUM_ITEMS);
  199. for(int i = 0; i < NUM_ITEMS; i++){
  200. int height = arrayInsert[i]*heightItem;
  201. int x = i * widthItem;
  202. g.drawRect(x , panelInsert.getHeight()-height , widthItem , height);
  203. }
  204. }
  205. };
  206.  
  207. JPanel panelNorth = new JPanel();
  208. panelNorth.setLayout(new GridLayout(1,2));
  209. panelNorth.add(startButton);
  210. panelNorth.add(resetButton);
  211. add(panelNorth , BorderLayout.NORTH);
  212. JPanel panelCenter = new JPanel();
  213. panelCenter.setLayout(new GridLayout(2,1));
  214. panelCenter.add(panelBooble);
  215. panelCenter.add(panelInsert);
  216. add(panelCenter);
  217. }
  218.  
  219. //Метод для создание рандомного массива
  220. public Integer[] initArray(){
  221. Integer[] nums = new Integer[NUM_ITEMS];
  222. for (int i = 1; i <= nums.length; i++) {
  223. nums[i - 1] = i;
  224. }
  225. Collections.shuffle(Arrays.asList(nums));
  226. return nums;
  227. }
  228.  
  229. public static void main(String[] args) {
  230. JFrame frame = new JFrame("Sorting");
  231. frame.add(new Sorting());
  232. frame.setPreferredSize(new Dimension(800,600));
  233. frame.pack();
  234. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  235. frame.setLocationRelativeTo(null);
  236. frame.setVisible(true);
  237. }
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement