Skip to content

Commit d8fe8d7

Browse files
author
Tomislav Marinkovic
committed
Add Merge to algorithms
1 parent 4f2297d commit d8fe8d7

14 files changed

+212
-70
lines changed

src/model/Algorithm.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package model;
22

3+
import model.Input.Input;
4+
35
public interface Algorithm {
46
int[] run(Input input);
57

src/model/Input.java

-24
This file was deleted.

src/model/Input/Input.java

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package model.Input;
2+
3+
public interface Input {
4+
5+
int[] getData();
6+
7+
}

src/model/Input/InsertSortInput.java

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package model.Input;
2+
3+
4+
public class InsertSortInput implements Input {
5+
6+
private int[] data;
7+
8+
public InsertSortInput(int[] data) {
9+
this.data = data;
10+
}
11+
12+
public int[] getData() {
13+
return data;
14+
}
15+
16+
}

src/model/Input/MergeInput.java

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package model.Input;
2+
3+
public class MergeInput implements Input {
4+
5+
private int[] data;
6+
private int startOfLeftArray;
7+
private int endOfLeftArray;
8+
private int endOfRightArray;
9+
10+
public MergeInput(int[] data, int startOfLeftArray, int endOfLeftArray, int endOfRightArray) {
11+
this.data = data;
12+
this.startOfLeftArray = startOfLeftArray;
13+
this.endOfLeftArray = endOfLeftArray;
14+
this.endOfRightArray = endOfRightArray;
15+
}
16+
17+
@Override
18+
public int[] getData() {
19+
return data;
20+
}
21+
22+
public int getStartOfLeftArray() {
23+
return startOfLeftArray;
24+
}
25+
26+
public int getEndOfLeftArray() {
27+
return endOfLeftArray;
28+
}
29+
30+
public int getEndOfRightArray() {
31+
return endOfRightArray;
32+
}
33+
}

src/model/Input/MergeSortInput.java

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package model.Input;
2+
3+
4+
public class MergeSortInput implements Input {
5+
6+
private int[] data;
7+
private int start;
8+
private int end;
9+
10+
public MergeSortInput(int[] data, int start, int end) {
11+
this.data = data;
12+
this.start = start;
13+
this.end = end;
14+
}
15+
16+
@Override
17+
public int[] getData() {
18+
return data;
19+
}
20+
21+
public int getStart() {
22+
return start;
23+
}
24+
25+
public int getEnd() {
26+
return end;
27+
}
28+
}

src/model/TimeComplexity.java

+11-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package model;
22

3+
import model.Input.InsertSortInput;
4+
import model.Input.MergeInput;
5+
import model.Input.MergeSortInput;
36
import sort.Data;
47
import sort.algorithm.InsertionSort;
8+
import sort.algorithm.Merge;
59
import sort.algorithm.MergeSort;
610

711
import java.util.ArrayList;
@@ -17,11 +21,11 @@ public void measure(Algorithm algorithm) {
1721
System.out.println("TIME COMPLEXITY ANALYSIS FOR: " + algorithm.getClass().getSimpleName());
1822
LinkedHashMap<Integer, Double> result = new LinkedHashMap<>();
1923

20-
if (algorithm instanceof MergeSort) {
24+
if (algorithm instanceof Merge) {
2125
int n = 200000;
2226
while (n <= 3200000) {
23-
int[] left = new InsertionSort(false).run(new Input(Data.getUnsortedArray(n / 2)));
24-
int[] right = new InsertionSort(false).run(new Input(Data.getUnsortedArray(n / 2)));
27+
int[] left = new InsertionSort(false).run(new InsertSortInput(Data.getUnsortedArray(n / 2)));
28+
int[] right = new InsertionSort(false).run(new InsertSortInput(Data.getUnsortedArray(n / 2)));
2529
int[] all = new int[n];
2630
for (int i = 0; i < n; i++) {
2731
if (i < n / 2) {
@@ -30,15 +34,16 @@ public void measure(Algorithm algorithm) {
3034
all[i] = right[i - n / 2];
3135
}
3236
}
33-
algorithm.run(new Input(all, (n / 2) - 1));
37+
algorithm.run(new MergeInput(all, 0, (n / 2) - 1, all.length - 1));
3438
result.put(n, algorithm.getExecutionTime());
3539
n *= 2;
3640
}
3741

38-
} else {
42+
}
43+
else {
3944
int n = 50000;
4045
while (n <= 800000) {
41-
algorithm.run(new Input(Data.getUnsortedArray(n)));
46+
algorithm.run(new InsertSortInput(Data.getUnsortedArray(n)));
4247
result.put(n, algorithm.getExecutionTime());
4348
n *= 2;
4449
}

src/sort/Executor.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
import model.TimeComplexity;
44
import sort.algorithm.InsertionSort;
5-
import sort.algorithm.MergeSort;
5+
import sort.algorithm.Merge;
66

77
public class Executor {
88

99
public static void main(String[] args) {
1010
new TimeComplexity().measure(new InsertionSort(true));
11-
new TimeComplexity().measure(new MergeSort(true));
11+
new TimeComplexity().measure(new Merge(true));
1212
}
1313
}

src/sort/algorithm/InsertionSort.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33

44
import model.Algorithm;
5-
import model.Input;
5+
import model.Input.Input;
66
import model.TimeMeasurement;
77

88
public class InsertionSort extends TimeMeasurement implements Algorithm {

src/sort/algorithm/Merge.java

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package sort.algorithm;
2+
3+
import model.Algorithm;
4+
import model.Input.Input;
5+
import model.Input.MergeInput;
6+
import model.TimeMeasurement;
7+
8+
public class Merge extends TimeMeasurement implements Algorithm {
9+
10+
public Merge(boolean showExecutionTime) {
11+
super(showExecutionTime);
12+
}
13+
14+
@Override
15+
public int[] run(Input input) {
16+
int data[] = input.getData();
17+
final int startOfLeft = ((MergeInput) input).getStartOfLeftArray();
18+
final int endOfLeft = ((MergeInput) input).getEndOfLeftArray();
19+
final int enfOfRight = ((MergeInput) input).getEndOfRightArray();
20+
21+
22+
start(data.length);
23+
24+
int n1 = endOfLeft - startOfLeft + 1;
25+
int n2 = enfOfRight - endOfLeft;
26+
27+
int[] Left = new int[n1 + 1];
28+
int[] Right = new int[n2 + 1];
29+
30+
for(int i = 0 ; i < n1 ; i++){
31+
Left[i] = data[startOfLeft+i];
32+
}
33+
34+
for(int i = 0 ; i < n2 ; i++){
35+
Right[i] = data[endOfLeft+i + 1];
36+
}
37+
38+
// System.arraycopy(data, 0, Left, 0, n1);
39+
// System.arraycopy(data, n1, Right, 0, n2);
40+
41+
Left[n1] = Integer.MAX_VALUE;
42+
Right[n2] = Integer.MAX_VALUE;
43+
44+
int leftIndex = 0;
45+
int rightIndex = 0;
46+
47+
for (int i = startOfLeft; i <= enfOfRight; i++) {
48+
if (Left[leftIndex] <= Right[rightIndex]) {
49+
data[i] = Left[leftIndex];
50+
leftIndex++;
51+
} else {
52+
data[i] = Right[rightIndex];
53+
rightIndex++;
54+
}
55+
}
56+
done();
57+
return data;
58+
59+
}
60+
}

src/sort/algorithm/MergeSort.java

+26-30
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,43 @@
11
package sort.algorithm;
22

33
import model.Algorithm;
4-
import model.Input;
5-
import model.TimeMeasurement;
4+
import model.Input.Input;
5+
import model.Input.MergeInput;
6+
import model.Input.MergeSortInput;
67

7-
public class MergeSort extends TimeMeasurement implements Algorithm {
8+
public class MergeSort implements Algorithm {
89

9-
public MergeSort(boolean showExecutionTime) {
10-
super(showExecutionTime);
11-
}
1210

1311
@Override
1412
public int[] run(Input input) {
15-
int[] data = input.getData();
13+
int data[] = input.getData();
14+
int p = ((MergeSortInput) input).getStart();
15+
int r = ((MergeSortInput) input).getEnd();
16+
17+
int t = p + 1;
1618

17-
start(data.length);
19+
if (t < r) {
20+
int q = (int) Math.floor((p + r) / 2.0);
21+
data = run(new MergeSortInput(data, p, q));
22+
data = run(new MergeSortInput(data, q, r));
23+
data = new Merge(false).run(new MergeInput(data, p, q - 1, r - 1));
24+
}
1825

19-
int n1 = input.getMergeSortBreak() + 1;
20-
int n2 = data.length - n1;
26+
return data;
27+
}
2128

22-
int[] Left = new int[n1+1];
23-
int[] Right = new int[n2+1];
29+
@Override
30+
public void start(int n) {
2431

25-
System.arraycopy(data, 0, Left, 0, n1);
26-
System.arraycopy(data, n1, Right, 0, n2);
32+
}
2733

28-
Left[n1] = Integer.MAX_VALUE;
29-
Right[n2] = Integer.MAX_VALUE;
34+
@Override
35+
public void done() {
3036

31-
int leftIndex = 0;
32-
int rightIndex = 0;
37+
}
3338

34-
for(int i = 0; i < data.length; i++){
35-
if(Left[leftIndex] <= Right[rightIndex]){
36-
data[i] = Left[leftIndex];
37-
leftIndex++;
38-
}
39-
else{
40-
data[i] = Right[rightIndex];
41-
rightIndex++;
42-
}
43-
}
44-
done();
45-
return data;
39+
@Override
40+
public Double getExecutionTime() {
41+
return null;
4642
}
4743
}

test/sort/algorithm/InsertionSortTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package sort.algorithm;
22

33

4-
import model.Input;
4+
import model.Input.InsertSortInput;
55
import org.junit.jupiter.api.Test;
66

77
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
@@ -11,7 +11,7 @@ class InsertionSortTest {
1111
@Test
1212
void shouldSort() {
1313
int[] data = new int[]{6, 65, 7, 9, 88, 4, 50, 24, 6};
14-
int[] actual = new InsertionSort(false).run(new Input(data));
14+
int[] actual = new InsertionSort(false).run(new InsertSortInput(data));
1515
int[] expected = new int[]{4, 6, 6, 7, 9, 24, 50, 65, 88};
1616

1717
assertArrayEquals(actual, expected);
+6-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package sort.algorithm;
22

3-
import model.Input;
3+
import model.Input.MergeSortInput;
44
import org.junit.jupiter.api.Test;
55

66
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
@@ -9,10 +9,11 @@ class MergeSortTest {
99

1010
@Test
1111
void shouldSort() {
12-
int[] data = new int[]{1,2,5,7,12,6,7,8,9};
13-
int[] actual = new MergeSort(false).run(new Input(data, 4));
14-
int[] expected = new int[]{1,2,5,6,7,7,8,9,12};
12+
int[] data = new int[]{6, 65, 7, 9, 88, 4, 50, 24, 6};
13+
int[] actual = new MergeSort().run(new MergeSortInput(data, 0, data.length));
14+
int[] expected = new int[]{4, 6, 6, 7, 9, 24, 50, 65, 88};
1515

1616
assertArrayEquals(actual, expected);
1717
}
18-
}
18+
19+
}

test/sort/algorithm/MergeTest.java

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package sort.algorithm;
2+
3+
import model.Input.MergeInput;
4+
import org.junit.jupiter.api.Test;
5+
6+
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
7+
8+
class MergeTest {
9+
10+
@Test
11+
void shouldSort() {
12+
int[] data = new int[]{1,2,5,7,12,6,7,8,9};
13+
int[] actual = new Merge(false).run(new MergeInput(data, 0, 4,8));
14+
int[] expected = new int[]{1,2,5,6,7,7,8,9,12};
15+
16+
assertArrayEquals(actual, expected);
17+
}
18+
}

0 commit comments

Comments
 (0)