/* * Copyright (C) 2016 Naman Dwivedi * * Licensed under the GNU General Public License v3 * * This is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. */ 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; public class BinarySearch extends Algorithm implements DataHandler { private BinarySearchVisualizer visualizer; private int[] array; private List<Integer> positions = new ArrayList<>(); public BinarySearch(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 low = 0; int high = array.length - 1; highlight(low, high); highlightTrace((int) (low + high) / 2); sleep(); while (high >= low) { int middle = (int) (low + high) / 2; addLog("Searching at index: " + middle); highlightTrace(middle); sleep(); if (array[middle] == data) { //found addLog(data + " is found at position " + (middle)); break; } if (array[middle] < data) { low = middle + 1; addLog("Going right"); highlight(low, high); sleep(); } if (array[middle] > data) { high = middle - 1; addLog("Going left"); highlight(low, high); sleepFor(800); } } completed(); } private void highlight(int minIndex, int maxIndex) { positions.clear(); for (int i = minIndex; i <= maxIndex; i++) { positions.add(i); } activity.runOnUiThread(new Runnable() { @Override public void run() { visualizer.highlight(positions); } }); } private void highlightTrace(final int pos) { activity.runOnUiThread(new Runnable() { @Override public void run() { visualizer.highlightTrace(pos); } }); } @Override public void onMessageReceived(String message) { if (message.equals(Algorithm.COMMAND_START_ALGORITHM)) { startExecution(); search(); } } @Override public void onDataRecieved(Object data) { this.array = (int[]) data; } }