Programming & Development / April 18, 2025

Implementing Search Algorithms in Java

search algorithms linear search binary search depth-first search breadth-first search Java programming

Searching is a crucial operation in many computer science applications. Whether you're looking for an element in a list or exploring data structures like trees and graphs, efficient search algorithms are vital. In this article, we'll walk through some commonly used search algorithms: Linear Search, Binary Search, Depth-First Search (DFS), and Breadth-First Search (BFS), all implemented in Java.

πŸ” 1. Linear Search

Description:

Linear Search is the simplest search algorithm. It works by checking each element in the list sequentially until the target element is found or the list ends. It does not require the list to be sorted.

Time Complexity:

  • O(n), where n is the number of elements in the list.

Java Code Example:

java

public class LinearSearch {
    public static int linearSearch(int[] arr, int x) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == x) {
                return i;  // Element found, return index
            }
        }
        return -1;  // Element not found
    }

    public static void main(String[] args) {
        int[] arr = {2, 3, 4, 10, 40};
        int x = 10;
        
        int result = linearSearch(arr, x);
        if (result == -1) {
            System.out.println("Element not present");
        } else {
            System.out.println("Element found at index " + result);
        }
    }
}

Explanation:

  • The linearSearch method iterates through each element of the array, comparing it with the target x.
  • If a match is found, it returns the index; otherwise, it returns -1 indicating the element is not present.

πŸ” 2. Binary Search

Description:

Binary Search is a highly efficient search algorithm that works by dividing the search interval in half. If the target value is less than the midpoint value, the algorithm searches the left half; otherwise, it searches the right half. Binary Search requires the list to be sorted.

Time Complexity:

  • O(log n), where n is the number of elements in the sorted list.

Java Code Example:

java

public class BinarySearch {
    public static int binarySearch(int[] arr, int x) {
        int low = 0, high = arr.length - 1;
        while (low <= high) {
            int mid = low + (high - low) / 2;

            if (arr[mid] == x) {
                return mid;  // Element found
            }

            if (arr[mid] < x) {
                low = mid + 1;  // Search right half
            } else {
                high = mid - 1;  // Search left half
            }
        }
        return -1;  // Element not found
    }

    public static void main(String[] args) {
        int[] arr = {2, 3, 4, 10, 40};
        int x = 10;
        
        int result = binarySearch(arr, x);
        if (result == -1) {
            System.out.println("Element not present");
        } else {
            System.out.println("Element found at index " + result);
        }
    }
}

Explanation:

  • The algorithm repeatedly divides the array into two halves and determines which half to search next.
  • It runs in logarithmic time due to halving the search space with each comparison.

πŸ” 3. Depth-First Search (DFS)

Description:

DFS explores as far down each branch of a tree or graph before backtracking. It's useful for traversing or searching through tree or graph structures.

Time Complexity:

  • O(V + E), where V is the number of vertices and E is the number of edges.

Java Code Example:

java

import java.util.*;

public class DFSSearch {
    private LinkedList<Integer>[] adj;

    DFSSearch(int v) {
        adj = new LinkedList[v];
        for (int i = 0; i < v; ++i) {
            adj[i] = new LinkedList<>();
        }
    }

    void addEdge(int v, int w) {
        adj[v].add(w);
    }

    void DFS(int v) {
        boolean[] visited = new boolean[adj.length];
        DFSUtil(v, visited);
    }

    void DFSUtil(int v, boolean[] visited) {
        visited[v] = true;
        System.out.print(v + " ");

        for (int n : adj[v]) {
            if (!visited[n]) {
                DFSUtil(n, visited);
            }
        }
    }

    public static void main(String[] args) {
        DFSSearch g = new DFSSearch(4);
        g.addEdge(0, 1);
        g.addEdge(0, 2);
        g.addEdge(1, 2);
        g.addEdge(2, 0);
        g.addEdge(2, 3);
        g.addEdge(3, 3);

        System.out.println("Depth First Traversal (starting from vertex 2):");
        g.DFS(2);
    }
}

Explanation:

  • DFS starts from a given node and explores as far as possible along each branch before backtracking.
  • The algorithm uses a recursive helper function to visit each vertex.

πŸ” 4. Breadth-First Search (BFS)

Description:

BFS explores all nodes at the present depth level before moving on to the next level. Like DFS, it’s also used for searching or traversing tree or graph data structures.

Time Complexity:

  • O(V + E), where V is the number of vertices and E is the number of edges.

Java Code Example:

java

import java.util.*;

public class BFSSearch {
    private LinkedList<Integer>[] adj;

    BFSSearch(int v) {
        adj = new LinkedList[v];
        for (int i = 0; i < v; ++i) {
            adj[i] = new LinkedList<>();
        }
    }

    void addEdge(int v, int w) {
        adj[v].add(w);
    }

    void BFS(int s) {
        boolean[] visited = new boolean[adj.length];
        LinkedList<Integer> queue = new LinkedList<>();

        visited[s] = true;
        queue.add(s);

        while (!queue.isEmpty()) {
            s = queue.poll();
            System.out.print(s + " ");

            for (int n : adj[s]) {
                if (!visited[n]) {
                    visited[n] = true;
                    queue.add(n);
                }
            }
        }
    }

    public static void main(String[] args) {
        BFSSearch g = new BFSSearch(4);
        g.addEdge(0, 1);
        g.addEdge(0, 2);
        g.addEdge(1, 2);
        g.addEdge(2, 0);
        g.addEdge(2, 3);
        g.addEdge(3, 3);

        System.out.println("Breadth First Traversal (starting from vertex 2):");
        g.BFS(2);
    }
}

Explanation:

  • BFS starts from a node and explores all of its neighbors before moving to the next level of neighbors.
  • It uses a queue to maintain the nodes to be visited.

πŸ“ˆ Conclusion

These are some of the most commonly used search algorithms, each with its own specific use cases and advantages. While Linear Search is the simplest, it can be inefficient for large datasets. Binary Search is much faster but requires a sorted list. DFS and BFS are essential for working with graphs and trees.

By understanding these algorithms and implementing them in Java, you'll have a solid foundation for handling search-related problems in your applications.


Comments

No comments yet

Add a new Comment

NUHMAN.COM

Information Technology website for Programming & Development, Web Design & UX/UI, Startups & Innovation, Gadgets & Consumer Tech, Cloud Computing & Enterprise Tech, Cybersecurity, Artificial Intelligence (AI) & Machine Learning (ML), Gaming Technology, Mobile Development, Tech News & Trends, Open Source & Linux, Data Science & Analytics

Categories

Tags

©{" "} Nuhmans.com . All Rights Reserved. Designed by{" "} HTML Codex