diff --git a/.gitignore b/.gitignore
index 8fb60fb..4042a10 100644
--- a/.gitignore
+++ b/.gitignore
@@ -198,3 +198,5 @@
/Semester 4/Assignments/DAO/target/
/Semester 4/Assignments/ProjectTrees_CalebFontenot/target/
/Semester 4/Assignments/DataStructures/target/
+/MergeSort/target/
+/Semester 3/Exams/ProgrammingExam2_CalebFontenot/target/
diff --git a/MergeSort/pom.xml b/MergeSort/pom.xml
new file mode 100644
index 0000000..800a51a
--- /dev/null
+++ b/MergeSort/pom.xml
@@ -0,0 +1,14 @@
+
+
+ 4.0.0
+ com.calebfontenot
+ MergeSort
+ 1.0-SNAPSHOT
+ jar
+
+ UTF-8
+ 20
+ 20
+ com.calebfontenot.mergesort.MergeSort
+
+
\ No newline at end of file
diff --git a/MergeSort/src/main/java/com/calebfontenot/mergesort/MergeSort.java b/MergeSort/src/main/java/com/calebfontenot/mergesort/MergeSort.java
new file mode 100644
index 0000000..c18c8dc
--- /dev/null
+++ b/MergeSort/src/main/java/com/calebfontenot/mergesort/MergeSort.java
@@ -0,0 +1,88 @@
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ */
+package com.calebfontenot.mergesort;
+
+/**
+ *
+ * @author caleb
+ */
+public class MergeSort {
+
+ public static void printArray(int[] array) {
+ for (int i = 0; i < array.length; i++) {
+ System.out.print(array[i] + " ");
+ }
+ System.out.println();
+ }
+
+ public static void main(String args[]) {
+
+ // merge sort = recursively divide array in 2, sort, re-combine
+ // run-time complexity = O(n Log n)
+ // space complexity = O(n)
+ int[] array = {8, 2, 5, 3, 4, 7, 6, 1, 0};
+ printArray(array);
+ mergeSort(array);
+ printArray(array);
+
+ }
+
+ private static void mergeSort(int[] array) {
+
+ int length = array.length;
+ if (length <= 1) {
+ return; //base case
+ }
+ int middle = length / 2;
+ int[] leftArray = new int[middle];
+ int[] rightArray = new int[length - middle];
+ int i = 0; //left array
+ int j = 0; //right array
+
+ for (; i < length; i++) {
+ if (i < middle) {
+ leftArray[i] = array[i];
+ } else {
+ rightArray[j] = array[i];
+ j++;
+ }
+ }
+ mergeSort(leftArray);
+ mergeSort(rightArray);
+ merge(leftArray, rightArray, array);
+ }
+
+ private static void merge(int[] leftArray, int[] rightArray, int[] array) {
+
+ int leftSize = array.length / 2;
+ int rightSize = array.length - leftSize;
+ int i = 0, l = 0, r = 0; //indices
+
+ //check the conditions for merging
+ while (l < leftSize && r < rightSize) {
+ if (leftArray[l] < rightArray[r]) {
+ array[i] = leftArray[l];
+ i++;
+ l++;
+ } else {
+ array[i] = rightArray[r];
+ i++;
+ r++;
+ }
+ }
+
+ while (l < leftSize) {
+ array[i] = leftArray[l];
+ i++;
+ l++;
+ }
+
+ while (r < rightSize) {
+ array[i] = rightArray[r];
+ i++;
+ r++;
+ }
+ }
+
+}
diff --git a/Semester 3/Exams/ProgrammingExam2_CalebFontenot/pom.xml b/Semester 3/Exams/ProgrammingExam2_CalebFontenot/pom.xml
new file mode 100644
index 0000000..7e046d8
--- /dev/null
+++ b/Semester 3/Exams/ProgrammingExam2_CalebFontenot/pom.xml
@@ -0,0 +1,14 @@
+
+
+ 4.0.0
+ com.calebfontenot
+ ProgrammingExam2_CalebFontenot
+ 1.0-SNAPSHOT
+ jar
+
+ UTF-8
+ 20
+ 20
+ com.calebfontenot.programmingexam2_calebfontenot.ProgrammingExam2_CalebFontenot
+
+
\ No newline at end of file
diff --git a/Semester 3/Exams/ProgrammingExam2_CalebFontenot/src/main/java/com/calebfontenot/programmingexam2_calebfontenot/ProgrammingExam2_CalebFontenot.java b/Semester 3/Exams/ProgrammingExam2_CalebFontenot/src/main/java/com/calebfontenot/programmingexam2_calebfontenot/ProgrammingExam2_CalebFontenot.java
new file mode 100644
index 0000000..c75414b
--- /dev/null
+++ b/Semester 3/Exams/ProgrammingExam2_CalebFontenot/src/main/java/com/calebfontenot/programmingexam2_calebfontenot/ProgrammingExam2_CalebFontenot.java
@@ -0,0 +1,144 @@
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ */
+
+package com.calebfontenot.programmingexam2_calebfontenot;
+
+/**
+ *
+ * @author caleb
+ */
+
+/**
+ *
+ * @author ar114
+ * @param
+ */
+public class ProgrammingExam2_CalebFontenot {
+
+ Node head;
+ Node tail;
+
+ class Node {
+
+ T t;
+ Node l;
+ Node r;
+ }
+
+ public T removeAt(int pos) {
+ if (pos < 0 || pos > size() - 1) {
+ throw new IndexOutOfBoundsException();
+ }
+
+ //list is empty
+ if (size() == 0) {
+ throw new RuntimeException("The list empty.");
+ }
+ T returnT = null;
+
+ if (pos == 0)//remove at 0
+ {
+ Node pointer = head.r;
+ returnT = (T) head.t;
+ pointer.l = null;
+ head = pointer;
+ } else if (pos == (size() - 1))//remove at end
+ {
+ Node pointer = tail.l.l;
+ returnT = (T) tail.t;
+ pointer.r = null;
+ tail = pointer;
+ } else//remove in the middle
+ {
+ // Iterate to the element position
+ Node pointer = head;
+ for (int i = 0; i < pos - 1; ++i) {
+ pointer = pointer.r;
+ }
+ returnT = (T) pointer.r.t;
+ pointer.r = pointer.r.r;
+ pointer.l = pointer.r;
+
+
+ }
+
+ return returnT;
+ }
+
+ public void clear() {
+ head = tail = null;
+ }
+
+ public void addAt(T t, int pos) {
+ if (pos < 0 || pos > size()) {
+ throw new IndexOutOfBoundsException();
+ }
+ Node newNode = new Node();
+ newNode.t = t;
+ if (head == null)//list is empty
+ {
+ head = tail = newNode;
+ } else if (pos == 0)//add at the front
+ {
+ newNode.r = head;
+ head.l = newNode;
+ head = newNode;
+ } else if (pos == size())//add at the end
+ {
+ newNode.l = tail;
+ tail.r = newNode;
+ tail = newNode;
+ } else//middle
+ {
+ Node p = head;
+ for (int i = 0; i < pos - 1; ++i) {
+ p = p.r;
+ }
+ newNode.l = p;
+ newNode.r = p.r;
+ p.r.l = newNode;
+ p.r = newNode;
+ }
+ }
+
+ public int size() {
+ Node p = head;
+ int count = 0;
+ while (p != null) {
+ count++;
+ p = p.r;
+ }
+ return count;
+ }
+
+ @Override
+ public String toString() {
+ String s = "";
+ Node p = head;
+ while (p != null) {
+ s += p.t.toString() + " ";
+ p = p.r;
+ }
+ return s;
+ }
+
+ public static void main(String[] args) {
+ ProgrammingExam2_CalebFontenot list = new ProgrammingExam2_CalebFontenot();
+
+ list.addAt(20, 0);
+ list.addAt(10, 0);
+ list.addAt(40, 2);
+ list.addAt(30, 2);
+ list.addAt(50, 4);
+ System.out.println(list);
+ System.out.println(list.removeAt(0));
+ System.out.println(list);
+ System.out.println(list.removeAt(2));
+ System.out.println(list);
+
+ System.out.println(list.removeAt(2));
+ System.out.println(list.toString());
+ }
+
+}