diff --git a/.gitignore b/.gitignore index 8e1707a..934e580 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ .gradle /local.properties .idea +.idea/misc.xml +.idea/modules.xml .DS_Store /build /captures diff --git a/.idea/misc.xml b/.idea/misc.xml index 62fabb1..19b901b 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,8 +1,5 @@ - - - - - - - - - - - - - - + diff --git a/README.md b/README.md index 8b446df..1af00ce 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Algorithm Visualizer for Android -##Visualizations +## Visualizations The following visualizations are available currently - @@ -22,7 +22,7 @@ The following visualizations are available currently - * BFS and DFS traversal * Dijkstara and Bellman Ford graph search -##Contributing +## Contributing Contributions are welcome to be able to provide visualizations for more algorithms. The existing API for visualizers are given below. These existing visualizers can be used directly for most algorithms. @@ -33,12 +33,13 @@ Binary Search | BSTAlgorithm | BSTVisualizer Linked List | LinkedList | LinkedListVisualizer Stack | Stack | StackVisualizer -Breadth first search | GraphTraversal| DirectedGraphVisualizer -Depth first search | GraphTraversal| DirectedGraphVisualizer +Breadth first search | GraphTraversal| DirectedGraphVisualizer +Depth first search | GraphTraversal| DirectedGraphVisualizer Dijkstara | DijkstraAlgorithm | WeightedGraphVisualizer Bellman Ford | BellmanFord | WeightedGraphVisualizer Bubble Sort | BubbleSort | SortingVisualizer Insertion Sort | InsertionSort | SortingVisualizer +Selection Sort | SelectionSort | SortingVisualizer All algorithm implementations must extend [Algorithm](https://github.com/naman14/AlgorithmVisualizer-Android/blob/master/app/src/main/java/com/naman14/algovisualizer/algorithm/Algorithm.java) and implement the [DataHandler](https://github.com/naman14/AlgorithmVisualizer-Android/blob/master/app/src/main/java/com/naman14/algovisualizer/algorithm/DataHandler.java) interface. The visualization happens on the main thread while the algorithms run in a seperate thread to be able to pause/resume execution. All data transfer must take place through the DataHandler interface. diff --git a/app/build.gradle b/app/build.gradle index 604b5f6..ec6680f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,13 +2,13 @@ apply plugin: 'com.android.application' apply plugin: 'io.fabric' android { - compileSdkVersion 24 - buildToolsVersion "24.0.3" + compileSdkVersion rootProject.compileSdkVersion + buildToolsVersion rootProject.buildToolsVersion defaultConfig { applicationId "com.naman14.algovisualizer" - minSdkVersion 16 - targetSdkVersion 24 + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion versionCode 3 versionName "1.0" } @@ -33,13 +33,13 @@ repositories { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:24.2.1' - compile 'com.android.support:design:24.2.1' + compile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion" + compile "com.android.support:design:$rootProject.supportLibraryVersion" compile 'com.roughike:bottom-bar:1.3.4' compile 'thereisnospon.codeview:codeview:0.3.1' compile 'com.anjlab.android.iab.v3:library:1.0.+' compile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') { - transitive = true; + transitive = true } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ec62b26..6914d91 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + BinarySearchVisualizer" ] }, + "linear_search": { + "Linear Search": "Linear search or sequential search is a method for finding a target value within a list. It sequentially checks each element of the list for the target value until a match is found or until all the elements have been searched.", + "Applications": [ + "Finding values in an unordered list" + ], + "Complexity": { + "Time": "worst O(N), best O(1), average O(N)", + "Space": "worst O(1) - iterative" + }, + "References": [ + "Wikipedia
" + ] + }, "bst_search": { "Binary Search Tree": "Binary search trees (BST), sometimes called ordered or sorted binary trees, are a particular type of containers: data structures that store \"items\" (such as numbers, names etc.) in memory. They allow fast lookup, addition and removal of items, and can be used to implement either dynamic sets of items, or lookup tables that allow finding an item by its key (e.g., finding the phone number of a person by name).", "Applications": [ @@ -69,6 +82,28 @@ "SortingVisualizer" ] }, + "selection_sort": { + "Selection Sort": "The selection sort algorithm sorts an array by repeatedly finding the minimum element (considering ascending order) from unsorted part and putting it at the beginning", + "Complexity": { + "Time": "worst O(n^2), best O(n^2), average O(n^2)", + "Space": "worst O(1) auxiliary" + }, + "References": [ + "Wikipedia
", + "SelectionSort", + "SortingVisualizer" + ] + }, + "quicksort": { + "Quicksort": "Quicksort (sometimes called partition-exchange sort) is an efficient sorting algorithm, serving as a systematic method for placing the elements of an array in order.", + "Complexity": { + "Time": "worst O(n^2), best O(nlogn), average O(nlogn)", + "Space": "worst O(logn)" + }, + "References": [ + "Quicksort
" + ] + }, "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 550e3e4..7ca22c3 100644 --- a/app/src/main/java/com/naman14/algovisualizer/AlgorithmCode.java +++ b/app/src/main/java/com/naman14/algovisualizer/AlgorithmCode.java @@ -46,6 +46,52 @@ public class AlgorithmCode { " addLog(\"Array has been sorted\");\n" + " completed();"; + public static final String CODE_SELECTION_SORT = " logArray(\"Original array - \", array);\n" + + "\n" + + " int n = array.length;\n" + + " for (int i = 0; i < n - 1; i++) {\n" + + " int min_idx = i;\n" + + " for (int j = i + 1; j < n; j++)\n" + + " if (array[j] < array[min_idx]) {\n" + + " min_idx = j;\n" + + " }\n" + + " int temp = array[min_idx];\n" + + " array[min_idx] = array[i];\n" + + " addLog(\"Swapping \" + array[i] + \" and \" + temp);\n" + + " highlightSwap(min_idx, i);\n" + + " array[i] = temp;\n" + + " sleep();\n" + + " }\n" + + " addLog(\"Array has been sorted\");\n" + + " completed();"; + + public static final String CODE_QUICKSORT = "int partition (int arr[], int low, int high)\n" + + "{\n" + + " int pivot = arr[high]; \n" + + " int i = (low - 1); \n" + + " \n" + + " for (int j = low; j <= high- 1; j++)\n" + + " {\n" + + " if (arr[j] <= pivot)\n" + + " {\n" + + " i++; \n" + + " swap(&arr[i], &arr[j]);\n" + + " }\n" + + " }\n" + + " swap(&arr[i + 1], &arr[high]);\n" + + " return (i + 1);\n" + + "}\n" + + "void quickSort(int arr[], int low, int high)\n" + + "{\n" + + " if (low < high)\n" + + " {\n" + + " int pi = partition(arr, low, high);\n" + + " \n" + + " quickSort(arr, low, pi - 1);\n" + + " quickSort(arr, pi + 1, high);\n" + + " }\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" + @@ -125,6 +171,20 @@ public class AlgorithmCode { " }\n" + " completed();"; + public static final String CODE_LINEAR_SEARCH = " logArray(\"Original array - \", array);\n" + + " addLog(\"Value to be searched - \", value);\n" + + " int n = array.length;\n" + + " int position = -1 ;\n" + + " for (int j = 0; j < n-1; j) {\n" + + " if (array[j] == value) \n" + + " pos = j ; \n" + + " break ; \n" + + " }\n" + + " if (pos == -1) \n" + + " addLog(\"Value not found in array\");\n" + + " else \n" + + " addLog(\"Value found in array at position - \", position);\n" ; + public static final String CODE_LINKED_LIST_INSERT = " Node nd = new Node();\n" + " nd.setValue(element);\n" + " addLog(\"Adding: \" + element + \" to the list\");\n" + diff --git a/app/src/main/java/com/naman14/algovisualizer/CodeFragment.java b/app/src/main/java/com/naman14/algovisualizer/CodeFragment.java index a9837ae..4df385f 100644 --- a/app/src/main/java/com/naman14/algovisualizer/CodeFragment.java +++ b/app/src/main/java/com/naman14/algovisualizer/CodeFragment.java @@ -64,9 +64,18 @@ public void setCode(String key) { case Algorithm.INSERTION_SORT: addCodeItem(AlgorithmCode.CODE_INSERTION_SORT, "Insertion sort"); break; + case Algorithm.SELECTION_SORT: + addCodeItem(AlgorithmCode.CODE_SELECTION_SORT,"Selection sort"); + break; + case Algorithm.QUICKSORT: + addCodeItem(AlgorithmCode.CODE_QUICKSORT, "Quicksort"); + break; case Algorithm.BST_SEARCH: addCodeItem(AlgorithmCode.CODE_BST_SEARCH, "BST Search"); break; + case Algorithm.LINEAR_SEARCH: + addCodeItem(AlgorithmCode.CODE_LINEAR_SEARCH, "Linear Search"); + break; case Algorithm.BST_INSERT: addCodeItem(AlgorithmCode.CODE_BST_INSERT, "BST Insert"); break; @@ -110,18 +119,44 @@ private void addCodeItem(String code, String title) { codeView.setTheme(CodeViewTheme.GITHUB); codeView.setHorizontalScrollBarEnabled(true); - //Temp solution, block parent touch evenets - codeView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - v.getParent().requestDisallowInterceptTouchEvent(true); - return false; - } - }); + codeView.setOnTouchListener(new HorizontalMoveListener()); codeView.showCode(code); codeLayout.addView(codeitem); } + + /** + * handle horizontal move + */ + class HorizontalMoveListener implements View.OnTouchListener { + + float downX = 0; + float downY = 0; + + @Override + public boolean onTouch(View v, MotionEvent event) { + int action = event.getAction(); + switch (action){ + case MotionEvent.ACTION_DOWN: + downX = event.getX(); + downY = event.getY(); + break; + case MotionEvent.ACTION_MOVE: + float dx = Math.abs(event.getX() - downX); + float dy = Math.abs(event.getY() - downY); + + if(dx > dy){ + v.getParent().requestDisallowInterceptTouchEvent(true); + } + + downX = event.getX(); + downY = event.getY(); + + break; + } + return false; + } + } } diff --git a/app/src/main/java/com/naman14/algovisualizer/DataUtils.java b/app/src/main/java/com/naman14/algovisualizer/DataUtils.java index 1f48f99..c6141d2 100644 --- a/app/src/main/java/com/naman14/algovisualizer/DataUtils.java +++ b/app/src/main/java/com/naman14/algovisualizer/DataUtils.java @@ -198,15 +198,22 @@ public static WeightedGraph2 createWeightedGraph2(int size) { } - public static int[] createSortedArray(int size) { + public static int[] createArray(int size, boolean sorted) { int[] integers = new int[size]; for (int i = 0; i < size; i++) { integers[i] = new Random().nextInt(88) + 10; } - Arrays.sort(integers); + if (sorted) + Arrays.sort(integers); return integers; } + public static int[][] createNQueenArray(int n) { + //all values will be initialised to zero + return new int[n][n]; + + } + public static int getRandomKeyFromBST() { int rnd = new Random().nextInt(bst_array.length); return bst_array[rnd]; diff --git a/app/src/main/java/com/naman14/algovisualizer/MainActivity.java b/app/src/main/java/com/naman14/algovisualizer/MainActivity.java index dd0730f..b269b0b 100644 --- a/app/src/main/java/com/naman14/algovisualizer/MainActivity.java +++ b/app/src/main/java/com/naman14/algovisualizer/MainActivity.java @@ -78,6 +78,9 @@ public boolean onChildClick(ExpandableListView expandableListView, View view, in case 0: algoFragment.setupFragment(Algorithm.BINARY_SEARCH); break; + case 1: + algoFragment.setupFragment(Algorithm.LINEAR_SEARCH); + break; } break; case 1: @@ -88,6 +91,12 @@ public boolean onChildClick(ExpandableListView expandableListView, View view, in case 1: algoFragment.setupFragment(Algorithm.INSERTION_SORT); break; + case 2: + algoFragment.setupFragment(Algorithm.SELECTION_SORT); + break; + case 3: + algoFragment.setupFragment(Algorithm.QUICKSORT); + break; } break; case 2: @@ -131,6 +140,13 @@ public boolean onChildClick(ExpandableListView expandableListView, View view, in } break; case 5: + switch (childPosition) { + case 0: + algoFragment.setupFragment(Algorithm.N_QUEENS); + break; + } + break; + case 6: switch (childPosition) { case 0: mDrawerLayout.closeDrawers(); @@ -149,6 +165,9 @@ public void run() { startActivity(intent); break; case 2: + startActivity(new Intent(MainActivity.this, SettingsActivity.class)); + break; + case 3: startActivity(new Intent(MainActivity.this, DonateActivity.class)); break; } @@ -191,17 +210,23 @@ private void prepareListData() { item5.setName("Graph"); listDataHeader.add(item5); + ExpandedMenuModel item6 = new ExpandedMenuModel(); + item6.setName("Backtracking"); + listDataHeader.add(item6); + ExpandedMenuModel item10 = new ExpandedMenuModel(); item10.setName("About"); listDataHeader.add(item10); List heading1 = new ArrayList<>(); heading1.add("Binary search"); + heading1.add("Linear Search"); List heading2 = new ArrayList(); heading2.add("Bubble Sort"); heading2.add("Insertion Sort"); - + heading2.add("Selection Sort"); + heading2.add("Quicksort"); List heading3 = new ArrayList(); heading3.add("BST Search"); heading3.add("BST Insert"); @@ -216,9 +241,13 @@ private void prepareListData() { heading5.add("Dijkstra"); heading5.add("Bellman Ford"); + List heading6 = new ArrayList(); + heading6.add("N Queens Problem"); + List heading10 = new ArrayList(); heading10.add("About"); heading10.add("Fork on Github"); + heading10.add("Settings"); try { if (BillingProcessor.isIabServiceAvailable(this)) { @@ -233,7 +262,8 @@ private void prepareListData() { listDataChild.put(listDataHeader.get(2), heading3); listDataChild.put(listDataHeader.get(3), heading4); listDataChild.put(listDataHeader.get(4), heading5); - listDataChild.put(listDataHeader.get(5), heading10); + listDataChild.put(listDataHeader.get(5), heading6); + listDataChild.put(listDataHeader.get(6), heading10); diff --git a/app/src/main/java/com/naman14/algovisualizer/SettingsActivity.java b/app/src/main/java/com/naman14/algovisualizer/SettingsActivity.java new file mode 100644 index 0000000..f5be681 --- /dev/null +++ b/app/src/main/java/com/naman14/algovisualizer/SettingsActivity.java @@ -0,0 +1,30 @@ +package com.naman14.algovisualizer; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; +import android.view.MenuItem; + +/** + * Created by naman on 13/9/17. + */ + +public class SettingsActivity extends AppCompatActivity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_settings); + + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setTitle("Settings"); + getFragmentManager().beginTransaction().replace(R.id.fragment_container, new SettingsFragment()).commit(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) + super.onBackPressed(); + return super.onOptionsItemSelected(item); + } +} diff --git a/app/src/main/java/com/naman14/algovisualizer/SettingsFragment.java b/app/src/main/java/com/naman14/algovisualizer/SettingsFragment.java new file mode 100644 index 0000000..d6c323a --- /dev/null +++ b/app/src/main/java/com/naman14/algovisualizer/SettingsFragment.java @@ -0,0 +1,44 @@ +package com.naman14.algovisualizer; + +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.EditTextPreference; +import android.preference.Preference; +import android.preference.PreferenceFragment; +import android.preference.PreferenceManager; +import android.support.annotation.Nullable; + +import com.naman14.algovisualizer.algorithm.Algorithm; + +/** + * Created by naman on 13/9/17. + */ + +public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { + + public static final String KEY_INTERVAL = "preference_interval"; + + SharedPreferences preferences; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.preferences); + + preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); + preferences.registerOnSharedPreferenceChangeListener(this); + findPreference(KEY_INTERVAL).setSummary(preferences.getString(KEY_INTERVAL, "500")); + + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + Preference p = findPreference(key); + if (p instanceof EditTextPreference) { + EditTextPreference editTextPref = (EditTextPreference) p; + p.setSummary(editTextPref.getText()); + Algorithm.setInterval(Integer.parseInt(editTextPref.getText())); + } + } +} diff --git a/app/src/main/java/com/naman14/algovisualizer/VisualAlgoFragment.java b/app/src/main/java/com/naman14/algovisualizer/VisualAlgoFragment.java index e66a594..c4ea7b5 100644 --- a/app/src/main/java/com/naman14/algovisualizer/VisualAlgoFragment.java +++ b/app/src/main/java/com/naman14/algovisualizer/VisualAlgoFragment.java @@ -15,6 +15,7 @@ package com.naman14.algovisualizer; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.design.widget.AppBarLayout; import android.support.design.widget.CoordinatorLayout; @@ -38,8 +39,11 @@ import com.naman14.algovisualizer.algorithm.list.LinkedList; import com.naman14.algovisualizer.algorithm.list.Stack; import com.naman14.algovisualizer.algorithm.search.BinarySearch; +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.QuickSort; +import com.naman14.algovisualizer.algorithm.sorting.SelectionSort; import com.naman14.algovisualizer.algorithm.tree.bst.BSTAlgorithm; import com.naman14.algovisualizer.visualizer.AlgorithmVisualizer; import com.naman14.algovisualizer.visualizer.ArrayVisualizer; @@ -123,6 +127,7 @@ public void onTabReSelected(int position) { algoFragment = AlgoDescriptionFragment.newInstance(getArguments().getString(Algorithm.KEY_ALGORITHM)); setupFragment(getArguments().getString(Algorithm.KEY_ALGORITHM)); + return rootView; } @@ -162,7 +167,13 @@ public void setupFragment(String algorithmKey) { visualizer = new BinarySearchVisualizer(getActivity()); appBarLayout.addView(visualizer); algorithm = new BinarySearch((BinarySearchVisualizer) visualizer, getActivity(), logFragment); - ((BinarySearch) algorithm).setData(DataUtils.createSortedArray(15)); + ((BinarySearch) algorithm).setData(DataUtils.createArray(15, true)); + break; + case Algorithm.LINEAR_SEARCH: + visualizer = new BinarySearchVisualizer(getActivity()); + appBarLayout.addView(visualizer); + algorithm = new LinearSearch((BinarySearchVisualizer) visualizer, getActivity(), logFragment); + ((LinearSearch) algorithm).setData(DataUtils.createArray(15, false)); break; case Algorithm.BUBBLE_SORT: visualizer = new SortingVisualizer(getActivity()); @@ -176,6 +187,18 @@ public void setupFragment(String algorithmKey) { algorithm = new InsertionSort((SortingVisualizer) visualizer, getActivity(), logFragment); ((InsertionSort) algorithm).setData(DataUtils.createRandomArray(15)); break; + case Algorithm.SELECTION_SORT: + visualizer = new SortingVisualizer(getActivity()); + appBarLayout.addView(visualizer); + algorithm = new SelectionSort((SortingVisualizer) visualizer, getActivity(), logFragment); + ((SelectionSort) algorithm).setData(DataUtils.createRandomArray(15)); + break; + case Algorithm.QUICKSORT: + visualizer = new SortingVisualizer(getActivity()); + appBarLayout.addView(visualizer); + algorithm = new QuickSort((SortingVisualizer) visualizer, getActivity(), logFragment); + ((QuickSort) algorithm).setData(DataUtils.createRandomArray(15)); + break; case Algorithm.BST_SEARCH: visualizer = new BSTVisualizer(getActivity()); appBarLayout.addView(visualizer); @@ -229,10 +252,15 @@ public void setupFragment(String algorithmKey) { algorithm = new BellmanFordAlgorithm((WeightedGraphVisualizer) visualizer, getActivity(), logFragment); ((BellmanFordAlgorithm) algorithm).setData(DataUtils.createWeightedGraph(5)); break; + case Algorithm.N_QUEENS: + visualizer = null; + break; default: visualizer = null; } + Algorithm.setInterval(Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(getActivity()) + .getString(SettingsFragment.KEY_INTERVAL, "500"))); algorithm.setStarted(false); fab.setImageResource(R.drawable.ic_play_arrow_white_24dp); logFragment.clearLog(); 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 464fceb..cff416d 100644 --- a/app/src/main/java/com/naman14/algovisualizer/algorithm/Algorithm.java +++ b/app/src/main/java/com/naman14/algovisualizer/algorithm/Algorithm.java @@ -18,9 +18,11 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.Message; +import android.preference.PreferenceManager; import com.naman14.algovisualizer.AlgoCompletionListener; import com.naman14.algovisualizer.LogFragment; +import com.naman14.algovisualizer.SettingsFragment; import java.util.concurrent.atomic.AtomicBoolean; @@ -30,7 +32,10 @@ public class Algorithm extends HandlerThread { public static final String COMMAND_START_ALGORITHM = "start"; public static final String BUBBLE_SORT = "bubble_sort"; 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 BINARY_SEARCH = "binary_search"; + public static final String LINEAR_SEARCH = "linear_search"; public static final String BST_INSERT = "bst_insert"; public static final String BST_SEARCH = "bst_search"; public static final String LINKED_LIST = "linked_list"; @@ -40,7 +45,7 @@ public class Algorithm extends HandlerThread { public static final String DFS = "dfs"; public static final String DIJKSTRA = "dijkstra"; public static final String BELLMAN_FORD = "bellman_ford"; - + public static final String N_QUEENS = "n_queens"; public LogFragment logFragment; public Activity activity; @@ -53,12 +58,14 @@ public class Algorithm extends HandlerThread { private Handler workerHandler; + private static int INTERVAL = 500; + public Algorithm() { super(""); } public void sleep() { - sleepFor(500); + sleepFor(INTERVAL); } public void sleepFor(long time) { @@ -190,4 +197,9 @@ public void run() { }); } } + + public static void setInterval(int interval) { + INTERVAL = interval; + } + } diff --git a/app/src/main/java/com/naman14/algovisualizer/algorithm/search/LinearSearch.java b/app/src/main/java/com/naman14/algovisualizer/algorithm/search/LinearSearch.java new file mode 100644 index 0000000..6ced994 --- /dev/null +++ b/app/src/main/java/com/naman14/algovisualizer/algorithm/search/LinearSearch.java @@ -0,0 +1,109 @@ +package com.naman14.algovisualizer.algorithm.search; + +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.BinarySearchVisualizer; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +/** + * Created by mayank on 27/11/16. + */ + +public class LinearSearch extends Algorithm implements DataHandler { + + private BinarySearchVisualizer visualizer; + private int[] array; + + private List positions = new ArrayList<>(); + + public LinearSearch(BinarySearchVisualizer visualizer, Activity activity, LogFragment logFragment) { + this.visualizer = visualizer; + this.activity = activity; + this.logFragment = logFragment; + } + + public void setData(final int[] array) { + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + visualizer.setData(array); + } + }); + start(); + prepareHandler(this); + sendData(array); + } + + private void search() { + + logArray("Array - ", array); + + int rnd = new Random().nextInt(array.length); + int data = array[rnd]; + addLog("Searching for - " + data); + + int n = array.length ; + + for (int i = 0 ; i pivot) { + j--; + } + if (i <= j) { + swap(i, j); + highlightSwap(i, j); + addLog("Swapping " + array[i] + " and " + array[j]); + //move index to next position on both sides + i++; + j--; + } + } + if (lowerIndex < j) + quickSort(lowerIndex, j); + if (i < higherIndex) + quickSort(i, higherIndex); + } + + private void swap(int i, int j) { + int temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + + @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(); + } + } + +} diff --git a/app/src/main/java/com/naman14/algovisualizer/algorithm/sorting/SelectionSort.java b/app/src/main/java/com/naman14/algovisualizer/algorithm/sorting/SelectionSort.java new file mode 100644 index 0000000..a26673f --- /dev/null +++ b/app/src/main/java/com/naman14/algovisualizer/algorithm/sorting/SelectionSort.java @@ -0,0 +1,63 @@ +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.visualizer.SortingVisualizer; + +/** + * Created by amit on 21/11/16. + */ + +public class SelectionSort extends SortAlgorithm { + + int[] array; + + public SelectionSort(SortingVisualizer visualizer, Activity activity, LogFragment logFragment) { + this.visualizer = visualizer; + this.activity = activity; + this.logFragment = logFragment; + } + + @Override + public void run() { + super.run(); + } + + private void sort() { + logArray("Original array - " ,array); + + int n = array.length; + for (int i = 0; i < n-1; i++) { + int min_idx = i; + for (int j = i+1; j < n; j++) + if (array[j] < array[min_idx]) { + min_idx = j; + } + int temp = array[min_idx]; + array[min_idx] = array[i]; + addLog("Swapping " + array[i] + " and " + temp); + highlightSwap(min_idx,i); + array[i] = temp; + sleep(); + } + addLog("Array has been sorted"); + completed(); + } + + @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(); + } + } +} diff --git a/app/src/main/java/com/naman14/algovisualizer/visualizer/Array2DVisualizer.java b/app/src/main/java/com/naman14/algovisualizer/visualizer/Array2DVisualizer.java new file mode 100644 index 0000000..58d6c40 --- /dev/null +++ b/app/src/main/java/com/naman14/algovisualizer/visualizer/Array2DVisualizer.java @@ -0,0 +1,43 @@ +package com.naman14.algovisualizer.visualizer; + +import android.content.Context; +import android.graphics.Canvas; +import android.util.AttributeSet; + +/** + * Created by naman on 13/9/17. + */ + +public class Array2DVisualizer extends AlgorithmVisualizer { + + private int[][] array; + + public Array2DVisualizer(Context context) { + super(context); + initialise(); + } + + public Array2DVisualizer(Context context, AttributeSet attrs) { + super(context, attrs); + initialise(); + } + + private void initialise() { + + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + } + + public void setData(int[][] data) { + this.array = data; + invalidate(); + } + + @Override + public void onCompleted() { + + } +} diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml new file mode 100644 index 0000000..0cef547 --- /dev/null +++ b/app/src/main/res/layout/activity_settings.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml new file mode 100644 index 0000000..a7c4b65 --- /dev/null +++ b/app/src/main/res/xml/preferences.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index e5fbd9f..04408b5 100644 --- a/build.gradle +++ b/build.gradle @@ -3,10 +3,12 @@ buildscript { repositories { jcenter() + google() + maven { url 'https://maven.google.com' } maven { url 'https://maven.fabric.io/public' } } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' + classpath 'com.android.tools.build:gradle:3.0.1' classpath 'io.fabric.tools:gradle:1.+' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -16,9 +18,22 @@ buildscript { allprojects { repositories { jcenter() + google() + maven { url 'https://maven.google.com' } } } task clean(type: Delete) { delete rootProject.buildDir } + +ext { + // Sdk and tools + minSdkVersion = 21 + targetSdkVersion = 26 + compileSdkVersion = 26 + buildToolsVersion = '27.0.3' + + // App dependencies + supportLibraryVersion = '27.0.2' +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c25cec5..cb1528e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip