1+ package main .java .Algorithms ;
2+
3+ import javax .swing .JPanel ;
4+ import javax .swing .SwingWorker ;
5+ import main .java .Bar ;
6+ import main .java .Settings ;
7+ import main .java .SortingAlgorithm ;
8+ import main .java .SortingOrder ;
9+ import main .java .FrameComponents .ViewPort ;
10+
11+ public class MergeSort extends SortingAlgorithm { //O(n log n), but more space
12+
13+ Bar [] ar = getArray ();
14+ public MergeSort (Bar [] in ) {
15+ super (in );
16+ }
17+
18+ @ Override
19+ public void sort (SortingOrder so ) {
20+ SwingWorker <Void , String > Worker = new SwingWorker <Void , String >(){
21+
22+ @ Override
23+ protected Void doInBackground () throws Exception {
24+ mergeSort (ar , so );
25+ return null ;
26+ }
27+ };
28+ Worker .execute ();
29+ }
30+
31+ void mergeSort (Bar [] ar , SortingOrder so ) throws Exception {
32+
33+ int length = ar .length ;
34+ if (length <= 1 ) return ; //base case
35+
36+ int middle = length / 2 ;
37+ Bar [] leftArray = new Bar [middle ];
38+ for (int i = 0 ; i <leftArray .length ; i ++) {
39+ leftArray [i ] = new Bar (new JPanel (), 10 );
40+ }
41+
42+ Bar [] rightArray = new Bar [length - middle ];
43+ for (int i = 0 ; i <rightArray .length ; i ++) {
44+ rightArray [i ] = new Bar (new JPanel (), 10 );
45+ }
46+
47+ int j = 0 ; //for rightArray
48+
49+ for (int l = 0 ;l < length ; l ++) {
50+ if (l < middle ) {
51+ leftArray [l ].value = ar [l ].value ;
52+ } else {
53+ rightArray [j ].value = ar [l ].value ;
54+ j ++;
55+ }
56+ }
57+ mergeSort (leftArray , so );
58+ mergeSort (rightArray , so );
59+ merge (leftArray , rightArray , ar , so );
60+ }
61+
62+ void merge (Bar [] leftArray , Bar [] rightArray , Bar [] ar , SortingOrder so ) throws Exception {
63+ int leftSize = ar .length / 2 ;
64+ int rightSize = ar .length - leftSize ;
65+ int i = 0 , l = 0 , r = 0 ; //indices
66+
67+ while (l < leftSize && r < rightSize ) {
68+ if (so ==SortingOrder .LtoH ) {
69+ if (leftArray [l ].value < rightArray [r ].value ) {
70+ ar [i ].value = leftArray [l ].value ;
71+ ViewPort .bars [i ].value = leftArray [l ].value ;
72+ ViewPort .bars [i ].panel .setBounds (0 ,Settings .allBarsPanelHeigth -ViewPort .bars [i ].value ,1000 ,ViewPort .bars [i ].value );
73+ Thread .sleep (Settings .sortingDelay );
74+ i ++;
75+ l ++;
76+ } else {
77+ ar [i ].value = rightArray [r ].value ;
78+ ViewPort .bars [i ].value = rightArray [r ].value ;
79+ ViewPort .bars [i ].panel .setBounds (0 ,Settings .allBarsPanelHeigth -ViewPort .bars [i ].value ,1000 ,ViewPort .bars [i ].value );
80+ Thread .sleep (Settings .sortingDelay );
81+ i ++;
82+ r ++;
83+ }
84+ } else {
85+ if (leftArray [l ].value > rightArray [r ].value ) {
86+ ar [i ].value = leftArray [l ].value ;
87+ ViewPort .bars [i ].value = leftArray [l ].value ;
88+ ViewPort .bars [i ].panel .setBounds (0 ,Settings .allBarsPanelHeigth -ViewPort .bars [i ].value ,1000 ,ViewPort .bars [i ].value );
89+ Thread .sleep (Settings .sortingDelay );
90+ i ++;
91+ l ++;
92+ } else {
93+ ar [i ].value = rightArray [r ].value ;
94+ ViewPort .bars [i ].value = rightArray [r ].value ;
95+ ViewPort .bars [i ].panel .setBounds (0 ,Settings .allBarsPanelHeigth -ViewPort .bars [i ].value ,1000 ,ViewPort .bars [i ].value );
96+ Thread .sleep (Settings .sortingDelay );
97+ i ++;
98+ r ++;
99+ }
100+ }
101+ }
102+
103+ while (l < leftSize ) {
104+ ar [i ].value = leftArray [l ].value ;
105+ ViewPort .bars [i ].value = leftArray [l ].value ;
106+ ViewPort .bars [i ].panel .setBounds (0 ,Settings .allBarsPanelHeigth -ViewPort .bars [i ].value ,1000 ,ViewPort .bars [i ].value );
107+ Thread .sleep (Settings .sortingDelay );
108+ i ++;
109+ l ++;
110+ }
111+ while (r < rightSize ) {
112+ ar [i ].value = rightArray [r ].value ;
113+ ViewPort .bars [i ].value = rightArray [r ].value ;
114+ ViewPort .bars [i ].panel .setBounds (0 ,Settings .allBarsPanelHeigth -ViewPort .bars [i ].value ,1000 ,ViewPort .bars [i ].value );
115+ Thread .sleep (Settings .sortingDelay );
116+ i ++;
117+ r ++;
118+ }
119+ }
120+ }
0 commit comments