Skip to content
Advertisement

Linear and binary search, printing out the results

The goal of this project is to create a class search. I will need methods of binary search and linear search. For each method you are going to ask the user for a key, then search for this key in an array of numbers (you can assume the numbers in the array). If you found the key return its location, otherwise returns -1. Test these methods by creating an object from the Search class (in the main method) and calling the linear and the binary methods.

Below I have created the code and I am trying to create my main so I can test the linear and binary methods but it is not working. It could be because I’m testing like three different classes in the same main, but I am not sure I formatted them in the right way and that’s the reason why I am getting errors. I need help, please.

My Search class.

`

public class Search {
    public static int linearsearch(int arr2[], int x2) {
        int N = arr2.length;
        for (int i = 0; i < N; i++) {
            if (arr2[i] == x2)
                return i;
        }
        return -1;
    }
    
    public int binarySearch(int arr3[], int l, int r, int x) {
        if (r >= l) {
            int mid = l + (r-1)/2;
            
            if (arr3[mid] ==x)
                return mid;
            
            if(arr3[mid] > x)
                return binarySearch(arr3, l, mid -1, x);
            
            return binarySearch(arr3, mid + 1, r, x);
        }
        
        return -1;
    }

}

My Main class

public class MainTester {
    public static void main(String args[]) {
    //sorting tester
    Sorting obj = new Sorting();
    int arr[] = {9,5,4,1,6,10,3,2,7,8};
    obj.bubbleSort(arr);
    System.out.println("Sorted array:");
    obj.printArray(arr);
    
    //binary search tester
    int arr3[] = {2,3,5,4,30};
    int n = arr3.length;
    int x = 10;
    int result = binarySearch(arr3, 0, n-1, x);
    if (result == -1)
        System.out.println("Element not present");
    else System.out.println("Element found " + result);
    
    //linear search tester
    int arr2[] = {2,3,4,10,30};
    int x2 = 10;
    
    int result2 = linearsearch(arr2, x2);
    if (result2 == -1)
        System.out.print("Element is not present in array.");
    else
        System.out.print("Element is present " +result2);
    
}

    private static int binarySearch(int[] arr3, int l, int r, int x) {
        // TODO Auto-generated method stub
        return -1;
    }

    private static int linearsearch(int[] arr2, int x) {
        // TODO Auto-generated method stub
        return -1;

    }

}

I was expecting this code to test all my methods in the main so I can print the result of my binary and linear search

Advertisement

Answer

Here is a working version of your code.

There was still some mistakes. See comments in code below.

Class ‘Search’

//Don't mix static and non static method
public class Search {
    
    //linearsearch replaced by linearSearch: use camel case in your class and method names
    //Try to use variable names that will help to understand your code.
    //Here 'x' has been replaced by 'numberToFind'

    public int linearSearch(int arr[], int numberToFind) {
        int n = arr.length;//N replaced by n: use Java coding convention
        for (int i = 0; i < n; i++) {
            if (arr[i] == numberToFind)
                return i;
        }
        return -1;
    }

    public int binarySearch(int arr[], int l, int r, int numberToFind) {
        if (r >= l) {
            // There was an error at line below when calculating the 'mid' number
            // int mid = l + (r - 1) / 2; 
            int mid = (l + r) / 2;

            if (arr[mid] == numberToFind)
                return mid;

            if (arr[mid] > numberToFind)
                return binarySearch(arr, l, mid - 1, numberToFind);

            return binarySearch(arr, mid + 1, r, numberToFind);
        }
        return -1;
    }
}

Class ‘MainTester’

Try to avoid repetitive code. If you have some, extract it to another method and call that method.

public class MainTester {
    private Search search;

    public MainTester() {
        super();
        search = new Search();
    }

    public void testLinearSearch(int[] numberArray, int numberToFind) {
        int result = search.linearSearch(numberArray, numberToFind);
        printResult("Linear search: ", numberToFind, result);
    }

    public void testBinarySearch(int[] arr, int numberToFind) {
        int result = search.binarySearch(arr, 0, arr.length - 1, numberToFind);
        printResult("Binary search: ", numberToFind, result);
    }

    private void printResult(String searchType, int searchNumber, int arrayIndex) {
        if (arrayIndex == -1)
            System.out.println(searchType + "Element " + searchNumber + " is not present in array.");
        else
            System.out.println(searchType + "Element " + searchNumber + " is present at index " + arrayIndex);
    }

    public static void main(String args[]) {
        MainTester tester = new MainTester();

        // Try to find a number using linear search
        int numbertoFind = 10;
        int[] arr2 = { 2, 3, 4, 10, 30 };
        tester.testLinearSearch(arr2, 10);

        // Try to find a number using binary search with an unsorted array: will not
        // work
        numbertoFind = 4;
        int[] unsortedArray = { 2, 3, 5, 4, 30 };
        tester.testBinarySearch(unsortedArray, numbertoFind);

        // Try to find a number using binary search with an sorted array: works
        int sortedArray[] = { 2, 3, 4, 5, 30 };
        tester.testBinarySearch(sortedArray, numbertoFind);
    }
}

Hope it helps.

User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement