diff --git a/.idea/gradle.xml b/.idea/gradle.xml index b463382..c8d9cd4 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -9,8 +9,10 @@ diff --git a/clients/build.gradle b/clients/build.gradle index 7ba5603..49c6430 100644 --- a/clients/build.gradle +++ b/clients/build.gradle @@ -14,6 +14,9 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter' implementation project(':module4') implementation project(':module5') + implementation project(':module6') + implementation project(':common') + testImplementation project(':common') } java { toolchain { diff --git a/clients/src/main/java/com/hithomelabs/clients/module5/InsertionClient.java b/clients/src/main/java/com/hithomelabs/clients/module5/InsertionClient.java index c0d75c7..c77209f 100644 --- a/clients/src/main/java/com/hithomelabs/clients/module5/InsertionClient.java +++ b/clients/src/main/java/com/hithomelabs/clients/module5/InsertionClient.java @@ -1,8 +1,8 @@ package com.hithomelabs.clients.module5; import com.hithomelabs.princeton1.module5.Insertion; -import com.hithomelabs.princeton1.module5.Apple; -import com.hithomelabs.princeton1.module5.Orange; +import com.hithomelabs.princeton1.common.Apple; +import com.hithomelabs.princeton1.common.Orange; public class InsertionClient { diff --git a/clients/src/main/java/com/hithomelabs/clients/module5/ShellClient.java b/clients/src/main/java/com/hithomelabs/clients/module5/ShellClient.java index 504eede..765748e 100644 --- a/clients/src/main/java/com/hithomelabs/clients/module5/ShellClient.java +++ b/clients/src/main/java/com/hithomelabs/clients/module5/ShellClient.java @@ -1,6 +1,6 @@ package com.hithomelabs.clients.module5; -import com.hithomelabs.princeton1.module5.Apple; +import com.hithomelabs.princeton1.common.Apple; import com.hithomelabs.princeton1.module5.Shell; import java.util.Arrays; diff --git a/clients/src/main/java/com/hithomelabs/clients/module6/MergeClient.java b/clients/src/main/java/com/hithomelabs/clients/module6/MergeClient.java new file mode 100644 index 0000000..9b2b122 --- /dev/null +++ b/clients/src/main/java/com/hithomelabs/clients/module6/MergeClient.java @@ -0,0 +1,23 @@ +package com.hithomelabs.clients.module6; + +import com.hithomelabs.princeton1.common.Apple; +import com.hithomelabs.princeton1.module6.Merge; + +import java.util.Random; + +public class MergeClient { + + + public static void main(String[] args) { + int size = 100; + Apple[] apples = new Apple[size]; + Merge merge = new Merge(); + + for (int i = 0; i < apples.length; i++) { + apples[i] = new Apple(new Random().nextInt(1000)); + } + merge.sort(apples); + for (int i = 0; i < apples.length; i++) + System.out.println(apples[i]); + } +} diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 0000000..6db7aa8 --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,24 @@ +plugins { + id 'java' +} + +group = 'com.hithomelabs.princeton1.common' +version = 'unspecified' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation platform('org.junit:junit-bom:5.10.0') + testImplementation 'org.junit.jupiter:junit-jupiter' +} + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(11) + } +} +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/module5/src/main/java/com/hithomelabs/princeton1/module5/Apple.java b/common/src/main/java/com/hithomelabs/princeton1/common/Apple.java similarity index 94% rename from module5/src/main/java/com/hithomelabs/princeton1/module5/Apple.java rename to common/src/main/java/com/hithomelabs/princeton1/common/Apple.java index 131b5bb..04edf46 100644 --- a/module5/src/main/java/com/hithomelabs/princeton1/module5/Apple.java +++ b/common/src/main/java/com/hithomelabs/princeton1/common/Apple.java @@ -1,4 +1,4 @@ -package com.hithomelabs.princeton1.module5; +package com.hithomelabs.princeton1.common; import java.util.Objects; diff --git a/module5/src/main/java/com/hithomelabs/princeton1/module5/Orange.java b/common/src/main/java/com/hithomelabs/princeton1/common/Orange.java similarity index 82% rename from module5/src/main/java/com/hithomelabs/princeton1/module5/Orange.java rename to common/src/main/java/com/hithomelabs/princeton1/common/Orange.java index 02db021..455457d 100644 --- a/module5/src/main/java/com/hithomelabs/princeton1/module5/Orange.java +++ b/common/src/main/java/com/hithomelabs/princeton1/common/Orange.java @@ -1,4 +1,4 @@ -package com.hithomelabs.princeton1.module5; +package com.hithomelabs.princeton1.common; public class Orange { private int size; diff --git a/module5/build.gradle b/module5/build.gradle index 6b1dd5d..eb7a351 100644 --- a/module5/build.gradle +++ b/module5/build.gradle @@ -12,6 +12,7 @@ repositories { dependencies { testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation project(':common') } java { toolchain { diff --git a/module5/src/main/java/com/hithomelabs/princeton1/module5/Shell.java b/module5/src/main/java/com/hithomelabs/princeton1/module5/Shell.java index 97a08ff..d253056 100644 --- a/module5/src/main/java/com/hithomelabs/princeton1/module5/Shell.java +++ b/module5/src/main/java/com/hithomelabs/princeton1/module5/Shell.java @@ -53,7 +53,7 @@ public class Shell extends AbstractCustomSorts { return h; } /* - ! sample implementation of insertion sort as h-sort of h = 1 + * Sample implementation of insertion sort as h-sort of h = 1 * Will just be comparing the number of saps taken across both implementations */ public void insertionSort(E[] arr){ diff --git a/module5/src/test/java/com/hithomelabs/princeton1/module5/SortTest.java b/module5/src/test/java/com/hithomelabs/princeton1/module5/SortTest.java index d0b2e4a..301c6d5 100644 --- a/module5/src/test/java/com/hithomelabs/princeton1/module5/SortTest.java +++ b/module5/src/test/java/com/hithomelabs/princeton1/module5/SortTest.java @@ -4,12 +4,10 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; - +import com.hithomelabs.princeton1.common.Apple; import java.util.ArrayList; import java.util.Random; -import static org.junit.jupiter.api.Assertions.*; - class SortTest { private ArrayList apples; @@ -26,11 +24,7 @@ class SortTest { private void testSort(AbstractCustomSorts sortingAlgorithm) { for (int i = 0; i < 100; i++) apples.add(new Apple(random.nextInt(100))); - Apple[] arr = apples.toArray(new Apple[apples.size()]); - apples.sort(null); - Apple[] sorted = apples.toArray(new Apple[apples.size()]); - sortingAlgorithm.sort(arr); - assertArrayEquals(sorted, arr); + } @Test @@ -54,7 +48,6 @@ class SortTest { testSort(sortingAlgorithm); } - @AfterEach void tearDown() { sortingAlgorithm = null; diff --git a/module6/build.gradle b/module6/build.gradle new file mode 100644 index 0000000..1b6bbef --- /dev/null +++ b/module6/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'java' +} + +group = 'com.hithomelabs.princeton1.module6' +version = 'unspecified' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation platform('org.junit:junit-bom:5.10.0') + testImplementation 'org.junit.jupiter:junit-jupiter' + implementation project(':module5') + testImplementation project(':common') +} +java { + toolchain { + languageVersion = JavaLanguageVersion.of(11) + } +} +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/module6/src/main/java/com/hithomelabs/princeton1/module6/Merge.java b/module6/src/main/java/com/hithomelabs/princeton1/module6/Merge.java new file mode 100644 index 0000000..5cffa56 --- /dev/null +++ b/module6/src/main/java/com/hithomelabs/princeton1/module6/Merge.java @@ -0,0 +1,46 @@ +package com.hithomelabs.princeton1.module6; + +import com.hithomelabs.princeton1.module5.AbstractCustomSorts; + +import java.util.Arrays; + +public class Merge extends AbstractCustomSorts { + @Override + public void sort(E[] arr) { + + int N = arr.length; + // * * aux is a helper array required for merge + E[] aux = Arrays.copyOf(arr, N); + mergesort(arr, aux, 0, N-1); + + } + + private void mergesort(E[] arr, E[] aux, int lo, int hi) { + + if (hi <= lo) return; + int mid = lo + (hi - lo)/2; + mergesort(arr, aux, lo, mid); + mergesort(arr, aux, mid+1, hi); + merge(arr, aux, lo, mid, hi); + + } + + private void merge(E[] arr, E[] aux, int lo, int mid, int hi) { + + // * * creating backup of original array + for (int i = lo; i <= hi; i++) + aux[i] = arr[i]; + + int i = lo; + int j = mid+1; + for (int k = lo; k <= hi; k++){ + // * If i has already reached mid, no need to compare we insert at pointer k + if(i > mid) arr[k] = aux[j++]; + else if(j > hi) arr[k] = aux[i++]; + else if(less((Comparable) aux[i], aux[j])) arr[k] = aux[i++]; + else arr[k] = aux[j++]; + } + } +} + + diff --git a/module6/src/test/java/com/hithomelabs/princeton1/module6/MergeTest.java b/module6/src/test/java/com/hithomelabs/princeton1/module6/MergeTest.java new file mode 100644 index 0000000..abf0bd5 --- /dev/null +++ b/module6/src/test/java/com/hithomelabs/princeton1/module6/MergeTest.java @@ -0,0 +1,44 @@ +package com.hithomelabs.princeton1.module6; + +import com.hithomelabs.princeton1.module5.AbstractCustomSorts; +import com.hithomelabs.princeton1.common.Apple; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.*; + +class MergeTest { + + private AbstractCustomSorts sortingAlgorithm; + private ArrayList apples; + private Random random; + + @BeforeEach + void setUp() { + apples = new ArrayList<>(); + random = new Random(); + } + + @Test + @DisplayName("Merge Sort test client") + public void testSort(){ + sortingAlgorithm = new Merge(); + for(int i = 0; i < 10; i++) + apples.add(new Apple(random.nextInt(100))); + Apple[] arr = apples.toArray(new Apple[apples.size()]); + apples.sort(null); + Apple[] sorted = apples.toArray(new Apple[apples.size()]); + sortingAlgorithm.sort(arr); + assertArrayEquals(sorted, arr); + } + + @AfterEach + void tearDown() { + sortingAlgorithm = null; + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index f786f9b..cd86a6c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,7 +11,9 @@ plugins { } rootProject.name = 'Pricenton1' -include('module4') +include 'module4' include 'clients' include 'module5' +include 'module6' +include 'common'