From f1faea3bebd5aaf61f35e1e7c2329f398967ed81 Mon Sep 17 00:00:00 2001 From: Johannes Schneider Date: Sat, 9 Nov 2019 19:41:03 -0500 Subject: [PATCH 1/2] Add merge sort --- .idea/gradle.xml | 4 + app/src/main/assets/desc.json | 6 ++ .../naman14/algovisualizer/AlgorithmCode.java | 28 ++++++ .../naman14/algovisualizer/CodeFragment.java | 3 + .../naman14/algovisualizer/MainActivity.java | 3 + .../algovisualizer/VisualAlgoFragment.java | 7 ++ .../algovisualizer/algorithm/Algorithm.java | 1 + .../algorithm/sorting/MergeSort.java | 87 +++++++++++++++++++ 8 files changed, 139 insertions(+) create mode 100644 app/src/main/java/com/naman14/algovisualizer/algorithm/sorting/MergeSort.java diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 7ac24c7..ee635a3 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -3,6 +3,9 @@ diff --git a/app/src/main/assets/desc.json b/app/src/main/assets/desc.json index beac5d2..c68b4ba 100644 --- a/app/src/main/assets/desc.json +++ b/app/src/main/assets/desc.json @@ -104,6 +104,12 @@ "Quicksort
" ] }, + "merge_sort": { + "Merge Sort": "Merge Sort is a Divide and Conquer algorithm. It divides input array in two halves, calls itself for the two halves and then merges the two sorted halves.", + "Complexity": { + "Time": "worst O(nlogn), best O(nlogn), average O(nlogn)", + "Space": "worst O(n)" + }, "linked_list": { "Singly linked list": "A Linked List is a linear collection of data elements, called nodes, each pointing to the next node by means of a pointer. It is a data structure consisting of a group of nodes which together represent a sequence. Under the simplest form, each node is composed of data and a reference (in other words, a link) to the next node in the sequence. ", "Complexity": { diff --git a/app/src/main/java/com/naman14/algovisualizer/AlgorithmCode.java b/app/src/main/java/com/naman14/algovisualizer/AlgorithmCode.java index 7ca22c3..4a756f7 100644 --- a/app/src/main/java/com/naman14/algovisualizer/AlgorithmCode.java +++ b/app/src/main/java/com/naman14/algovisualizer/AlgorithmCode.java @@ -92,6 +92,34 @@ public class AlgorithmCode { " }\n" + "}"; + public static final String CODE_MERGE_SORT = " void mergesort(int[] array, int[] temp, int leftStart, int rightEnd){\n" + + " if(leftStart >= rightEnd) return;\n" + + " int middle = (leftStart + rightEnd) / 2;\n" + + " mergesort(array, temp, leftStart, middle);\n" + + " mergesort(array, temp, middle + 1, rightEnd);\n" + + " mergeHalves(array, temp, leftStart, rightEnd);\n" + + " }\n" + + "\n" + + " void mergeHalves(int[] array, int[] temp, int leftStart, int rightEnd){\n" + + " int leftEnd = (leftStart + rightEnd) / 2;\n" + + " int rightStart = leftEnd + 1;\n" + + " int size = rightEnd - leftStart + 1;\n" + + "\n" + + " int left = leftStart;\n" + + " int right = rightStart;\n" + + " int index = leftStart;\n" + + "\n" + + " while(left <= leftEnd && right <= rightEnd) {\n" + + " if(array[left] <= array[right]){\n" + + " temp[index] = array[left];\n" + + " left++;\n" + + " } else{\n" + + " temp[index] = array[right];\n" + + " right++;\n" + + " }\n" + + " index++;\n" + + " }"; + public static final String CODE_BST_SEARCH = " int id = DataUtils.getRandomKeyFromBST();\n" + " addLog(\"Searching for \" + String.valueOf(id));\n" + " BinarySearchTree.Node current = b.getRoot();\n" + diff --git a/app/src/main/java/com/naman14/algovisualizer/CodeFragment.java b/app/src/main/java/com/naman14/algovisualizer/CodeFragment.java index 4df385f..a888a99 100644 --- a/app/src/main/java/com/naman14/algovisualizer/CodeFragment.java +++ b/app/src/main/java/com/naman14/algovisualizer/CodeFragment.java @@ -70,6 +70,9 @@ public void setCode(String key) { case Algorithm.QUICKSORT: addCodeItem(AlgorithmCode.CODE_QUICKSORT, "Quicksort"); break; + case Algorithm.MERGE_SORT: + addCodeItem(AlgorithmCode.CODE_MERGE_SORT, "Merge sort"); + break; case Algorithm.BST_SEARCH: addCodeItem(AlgorithmCode.CODE_BST_SEARCH, "BST Search"); break; diff --git a/app/src/main/java/com/naman14/algovisualizer/MainActivity.java b/app/src/main/java/com/naman14/algovisualizer/MainActivity.java index b269b0b..c5e55e1 100644 --- a/app/src/main/java/com/naman14/algovisualizer/MainActivity.java +++ b/app/src/main/java/com/naman14/algovisualizer/MainActivity.java @@ -97,6 +97,8 @@ public boolean onChildClick(ExpandableListView expandableListView, View view, in case 3: algoFragment.setupFragment(Algorithm.QUICKSORT); break; + case 4: + algoFragment.setupFragment(Algorithm.MERGE_SORT); } break; case 2: @@ -227,6 +229,7 @@ private void prepareListData() { heading2.add("Insertion Sort"); heading2.add("Selection Sort"); heading2.add("Quicksort"); + heading2.add("Merge Sort"); List heading3 = new ArrayList(); heading3.add("BST Search"); heading3.add("BST Insert"); diff --git a/app/src/main/java/com/naman14/algovisualizer/VisualAlgoFragment.java b/app/src/main/java/com/naman14/algovisualizer/VisualAlgoFragment.java index c4ea7b5..9c3979b 100644 --- a/app/src/main/java/com/naman14/algovisualizer/VisualAlgoFragment.java +++ b/app/src/main/java/com/naman14/algovisualizer/VisualAlgoFragment.java @@ -42,6 +42,7 @@ import com.naman14.algovisualizer.algorithm.search.LinearSearch; import com.naman14.algovisualizer.algorithm.sorting.BubbleSort; import com.naman14.algovisualizer.algorithm.sorting.InsertionSort; +import com.naman14.algovisualizer.algorithm.sorting.MergeSort; import com.naman14.algovisualizer.algorithm.sorting.QuickSort; import com.naman14.algovisualizer.algorithm.sorting.SelectionSort; import com.naman14.algovisualizer.algorithm.tree.bst.BSTAlgorithm; @@ -205,6 +206,12 @@ public void setupFragment(String algorithmKey) { algorithm = new BSTAlgorithm((BSTVisualizer) visualizer, getActivity(), logFragment); ((BSTAlgorithm) algorithm).setData(DataUtils.createBinaryTree()); break; + case Algorithm.MERGE_SORT: + visualizer = new SortingVisualizer(getActivity()); + appBarLayout.addView(visualizer); + algorithm = new MergeSort((SortingVisualizer) visualizer, getActivity(), logFragment); + ((MergeSort) algorithm).setData(DataUtils.createRandomArray(30)); + break; case Algorithm.BST_INSERT: visualizer = new BSTVisualizer(getActivity(), 280); ArrayVisualizer arrayVisualizer = new ArrayVisualizer(getActivity()); diff --git a/app/src/main/java/com/naman14/algovisualizer/algorithm/Algorithm.java b/app/src/main/java/com/naman14/algovisualizer/algorithm/Algorithm.java index cff416d..09df269 100644 --- a/app/src/main/java/com/naman14/algovisualizer/algorithm/Algorithm.java +++ b/app/src/main/java/com/naman14/algovisualizer/algorithm/Algorithm.java @@ -34,6 +34,7 @@ public class Algorithm extends HandlerThread { public static final String INSERTION_SORT = "insertion_sort"; public static final String SELECTION_SORT = "selection_sort"; public static final String QUICKSORT = "quicksort"; + public static final String MERGE_SORT = "merge_sort"; public static final String BINARY_SEARCH = "binary_search"; public static final String LINEAR_SEARCH = "linear_search"; public static final String BST_INSERT = "bst_insert"; diff --git a/app/src/main/java/com/naman14/algovisualizer/algorithm/sorting/MergeSort.java b/app/src/main/java/com/naman14/algovisualizer/algorithm/sorting/MergeSort.java new file mode 100644 index 0000000..67503b6 --- /dev/null +++ b/app/src/main/java/com/naman14/algovisualizer/algorithm/sorting/MergeSort.java @@ -0,0 +1,87 @@ +package com.naman14.algovisualizer.algorithm.sorting; + +import android.app.Activity; + +import com.naman14.algovisualizer.LogFragment; +import com.naman14.algovisualizer.algorithm.Algorithm; +import com.naman14.algovisualizer.algorithm.DataHandler; +import com.naman14.algovisualizer.visualizer.SortingVisualizer; + +public class MergeSort extends SortAlgorithm implements DataHandler { + + int[] array; + + public MergeSort(SortingVisualizer visualizer, Activity activity, LogFragment logFragment) { + this.visualizer = visualizer; + this.activity = activity; + this.logFragment = logFragment; + } + + @Override + public void run() { + super.run(); + } + + // Sorting algorithm (merge sort) + private void sort() { + logArray("Original array - ", array); + if (array == null || array.length == 0) return; + + mergesort(array, new int[array.length], 0, array.length - 1); + addLog("Array has been sorted"); + completed(); + } + + private void mergesort(int[] array, int[] temp, int leftStart, int rightEnd){ + if(leftStart >= rightEnd) return; + int middle = (leftStart + rightEnd) / 2; + mergesort(array, temp, leftStart, middle); + mergesort(array, temp, middle + 1, rightEnd); + mergeHalves(array, temp, leftStart, rightEnd); + } + + private void mergeHalves(int[] array, int[] temp, int leftStart, int rightEnd) { + int leftEnd = (leftStart + rightEnd) / 2; + int rightStart = leftEnd + 1; + int size = rightEnd - leftStart + 1; + + int left = leftStart; + int right = rightStart; + int index = leftStart; + + while(left <= leftEnd && right <= rightEnd) { + highlightSwap(left, right); + addLog("Swapping " + array[left] + " and " + array[right]); + if(array[left] <= array[right]){ + temp[index] = array[left]; + left++; + } else{ + temp[index] = array[right]; + right++; + } + sleep(); + index++; + } +// given two arrays, copies one to the other + System.arraycopy(array, left, temp, index, leftEnd - left + 1); + System.arraycopy(array, right, temp, index, rightEnd - right + 1); + System.arraycopy(temp, leftStart, array, leftStart, size); + + } + + @Override + public void onDataRecieved(Object data) { + super.onDataRecieved(data); + this.array = (int[]) data; + } + + @Override + public void onMessageReceived(String message) { + super.onMessageReceived(message); + if (message.equals(Algorithm.COMMAND_START_ALGORITHM)) { + startExecution(); + sort(); + } + } + +} From 965bea9243ff254430e2b385ad77a9fb3cbe070e Mon Sep 17 00:00:00 2001 From: Johannes Schneider Date: Sat, 9 Nov 2019 19:59:18 -0500 Subject: [PATCH 2/2] Add merge sort --- .../com/naman14/algovisualizer/algorithm/sorting/MergeSort.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/naman14/algovisualizer/algorithm/sorting/MergeSort.java b/app/src/main/java/com/naman14/algovisualizer/algorithm/sorting/MergeSort.java index 67503b6..7fc89a6 100644 --- a/app/src/main/java/com/naman14/algovisualizer/algorithm/sorting/MergeSort.java +++ b/app/src/main/java/com/naman14/algovisualizer/algorithm/sorting/MergeSort.java @@ -17,6 +17,7 @@ public MergeSort(SortingVisualizer visualizer, Activity activity, LogFragment lo this.logFragment = logFragment; } + @Override public void run() { super.run();