Java Array Algorithms: Sum, Average, Min/Max & Searching

โ˜• Java 21+ LTS ๐ŸŸข Chapter 29 of 47 ๐Ÿ“‚ Phase 7: Arrays & Matrices ๐Ÿ“… 2026 Edition
๐Ÿ“Œ Covered in this chapter:

Sum & Average Calculations ยท Finding Maximum and Minimum ยท Second Largest Element ($O(N)$) ยท Linear Search Algorithm ยท Binary Search Algorithm ($O(\log N)$) ยท Arrays.binarySearch() Mechanics

Mastering essential algorithmic patterns on Java arrays: calculating aggregate metrics (sum, floating-point average), determining minimum and maximum values without off-by-one errors, single-pass second largest discovery, linear search for unsorted data, and high-speed binary search on sorted sequences.

1. Array Aggregations: Sum and Floating-Point Average

Calculating statistical aggregates over an array requires accumulating values in a running counter:

int[] numbers = {10, 20, 30, 40, 50};
int sum = 0;

for (int num : numbers) {
sum += num;
}
// CRITICAL: Cast sum to double before division to prevent integer truncation!
double average = (double) sum / numbers.length;

Integer Division Pitfall:
If sum = 15 and length = 4, 15 / 4 produces integer 3, discarding the decimal .75. Always write (double) sum / length to receive 3.75.

2. Finding Maximum and Minimum Elements (The Golden Rule)

To find the maximum or minimum value in an array:

The Mistake to Avoid:
Never initialize int max = 0;! If the array contains only negative numbers (e.g. {-15, -8, -42, -99}), your program will incorrectly report 0 as the maximum even though 0 is not in the array!

The Correct Approach:
Always initialize max and min with the first element arr[0] (or Integer.MIN_VALUE / Integer.MAX_VALUE):

int[] data = {-15, -8, -42, -99};
int max = data[0];
int min = data[0];

for (int i = 1; i < data.length; i++) {
if (data[i] > max) max = data[i];
if (data[i] < min) min = data[i];
}

3. Single-Pass Second Largest Element Algorithm (O(N))

Finding the second largest value without sorting (which takes $O(N \log N)$) can be solved in a single $O(N)$ pass:

int largest = Integer.MIN_VALUE;
int secondLargest = Integer.MIN_VALUE;

for (int num : arr) {
if (num > largest) {
secondLargest = largest;
largest = num;
} else if (num > secondLargest && num != largest) {
secondLargest = num;
}
}

4. Linear Search vs Binary Search Comparison

Algorithm Prerequisite Time Complexity Space Complexity How it Works
Linear Search None (Works on unsorted arrays) O(N) (Scans up to N elements) O(1) Iterates from index 0 to length - 1 checking if (arr[i] == target).
Binary Search Must be SORTED O(log N) (Halves search space each step) O(1) Compares target with middle element; discards left or right half.

Binary Search Efficiency:
For 1,000,000 items:
- Linear Search: Up to 1,000,000 comparisons.
- Binary Search: Maximum 20 comparisons! ($log_2(1000000) \approx 19.93$).

5. Binary Search Safe Mid Calculation

In standard binary search, calculating mid = (left + right) / 2 has a famous 32-bit integer overflow bug when left + right > 2,147,483,647.

The Production Safe Formula:
$$\text{mid} = \text{left} + \frac{\text{right} - \text{left}}{2}$$

Beginner Example & Code Anatomy

โ˜• Main.java โ€” Chapter 29 Core Example
import java.util.Arrays;

public class Main {
    // 1. Linear Search Implementation (O(N))
    public static int linearSearch(int[] arr, int target) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == target) {
                return i; // Found at index i
            }
        }
        return -1; // Not found
    }

    // 2. Binary Search Implementation (O(log N))
    public static int binarySearch(int[] arr, int target) {
        int left = 0;
        int right = arr.length - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2; // Overflow-safe

            if (arr[mid] == target) {
                return mid; // Target matched
            } else if (arr[mid] < target) {
                left = mid + 1; // Search right half
            } else {
                right = mid - 1; // Search left half
            }
        }
        return -1; // Target not present
    }

    public static void main(String[] args) {
        int[] scores = {45, 92, 18, 77, 85, 99, 63};

        System.out.println("=== 1. Sum, Average, Min & Max ===");
        int sum = 0;
        int min = scores[0];
        int max = scores[0];

        for (int s : scores) {
            sum += s;
            if (s < min) min = s;
            if (s > max) max = s;
        }
        double avg = (double) sum / scores.length;

        System.out.println("Dataset               : " + Arrays.toString(scores));
        System.out.println("Total Sum             : " + sum);
        System.out.printf("Average               : %.2f%n", avg);
        System.out.println("Smallest (Min)        : " + min);
        System.out.println("Largest (Max)         : " + max);

        System.out.println("
=== 2. Single-Pass Second Largest ===");
        int largest = Integer.MIN_VALUE;
        int secondLargest = Integer.MIN_VALUE;
        for (int s : scores) {
            if (s > largest) {
                secondLargest = largest;
                largest = s;
            } else if (s > secondLargest && s != largest) {
                secondLargest = s;
            }
        }
        System.out.println("Largest Value         : " + largest);
        System.out.println("Second Largest Value  : " + secondLargest);

        System.out.println("
=== 3. Linear Search ===");
        int searchTarget = 85;
        int linearIdx = linearSearch(scores, searchTarget);
        System.out.println("Linear Search for " + searchTarget + " : Found at index " + linearIdx);

        System.out.println("
=== 4. Binary Search (Sorted Array) ===");
        Arrays.sort(scores); // Must sort before Binary Search!
        System.out.println("Sorted Dataset        : " + Arrays.toString(scores));
        int binaryIdx = binarySearch(scores, searchTarget);
        System.out.println("Custom Binary Search  : Found at index " + binaryIdx);

        int builtinIdx = Arrays.binarySearch(scores, searchTarget);
        System.out.println("Arrays.binarySearch() : Found at index " + builtinIdx);
    }
}
๐Ÿ’ป Program Console Output
=== 1. Sum, Average, Min & Max === Dataset : [45, 92, 18, 77, 85, 99, 63] Total Sum : 479 Average : 68.43 Smallest (Min) : 18 Largest (Max) : 99 === 2. Single-Pass Second Largest === Largest Value : 99 Second Largest Value : 92 === 3. Linear Search === Linear Search for 85 : Found at index 4 === 4. Binary Search (Sorted Array) === Sorted Dataset : [18, 45, 63, 77, 85, 92, 99] Custom Binary Search : Found at index 4 Arrays.binarySearch() : Found at index 4

๐Ÿ” Line-by-Line Code Explanation

double avg = (double) sum / scores.length;

Casts integer sum to double before division to preserve fractional precision.

if (s > largest) { secondLargest = largest; largest = s; }

Maintains running track of top two maximums in single linear O(N) pass.

linearSearch(scores, searchTarget);

Sequentially inspects each index from 0 to N-1; suitable for unsorted datasets.

int mid = left + (right - left) / 2;

Calculates the midpoint index without risking 32-bit integer overflow.

Arrays.binarySearch(scores, searchTarget);

Invokes Java's standard library binary search on the sorted array in O(log N) time.

Practical Real-World Example

โ˜• PracticalApplication.java โ€” Industry Implementation
public class PracticalApplication {
    public static void main(String[] args) {
        // Industry Simulation: Server Response Time Telemetry Analysis
        int[] latencyMs = {120, 85, 430, 210, 95, 850, 110, 340};

        int total = 0;
        int slaViolations = 0; // Requests taking > 300ms
        int maxLatency = latencyMs[0];

        for (int lat : latencyMs) {
            total += lat;
            if (lat > 300) slaViolations++;
            if (lat > maxLatency) maxLatency = lat;
        }

        double avgLatency = (double) total / latencyMs.length;
        System.out.println("=== API Gateway Latency Report ===");
        System.out.printf("Average Latency       : %.2f ms%n", avgLatency);
        System.out.println("Peak Latency (Max)    : " + maxLatency + " ms");
        System.out.println("SLA Breaches (>300ms) : " + slaViolations + " requests");
    }
}
๐Ÿ’ป Practical Console Output
=== API Gateway Latency Report === Average Latency : 280.00 ms Peak Latency (Max) : 850 ms SLA Breaches (>300ms) : 3 requests
โš ๏ธ Common Mistakes & Professional Best Practices
  • Performing Binary Search on an unsorted array, which returns completely unpredictable or negative results.
  • Initializing min or max with 0 instead of arr[0], breaking calculations when all numbers are negative.
  • Dividing integers without casting to double (e.g. sum / length instead of (double) sum / length), losing decimals.
  • Using mid = (left + right) / 2 which can overflow for very large arrays with millions of elements.
๐ŸŽฏ Hands-on Coding Challenge

Test your understanding by writing the code directly in your editor or running in our online Java compiler:

โ˜• Challenge.java
// Coding Challenge:
// Write a method findThirdLargest(int[] arr) that finds the third largest distinct number in an array in O(N) time.
// If less than 3 distinct numbers exist, return the maximum value.

public class Challenge {
    public static int findThirdLargest(int[] arr) {
        long first = Long.MIN_VALUE;
        long second = Long.MIN_VALUE;
        long third = Long.MIN_VALUE;

        for (int num : arr) {
            if (num > first) {
                third = second;
                second = first;
                first = num;
            } else if (num > second && num != first) {
                third = second;
                second = num;
            } else if (num > third && num != second && num != first) {
                third = num;
            }
        }

        return third == Long.MIN_VALUE ? (int) first : (int) third;
    }

    public static void main(String[] args) {
        System.out.println("Third Largest: " + findThirdLargest(new int[]{10, 45, 99, 85, 23})); // 45
        System.out.println("Third Largest: " + findThirdLargest(new int[]{10, 20})); // 20
    }
}

๐Ÿ’ก Frequently Asked Questions & Interview Insights

โ“ What does Arrays.binarySearch() return if the element is NOT found?

It returns `-(insertion_point + 1)`, where `insertion_point` is the index where the key would be inserted to maintain sorted order. For example, returning `-1` means the element should be inserted at index 0.

โ“ When should I use Linear Search instead of Binary Search?

Use Linear Search when the array is unsorted and you only perform a single search (because sorting takes $O(N \log N)$, which is slower than a single $O(N)$ scan). If you need to search multiple times, sort once and use Binary Search.

โ“ How does (double) sum / arr.length work?

The cast `(double) sum` converts the integer sum into a 64-bit IEEE 754 floating-point number *before* the division operator runs, forcing floating-point division rather than integer division.

๐Ÿš€ Quick Chapter Recap

  • Always cast sum to (double) before dividing by length to compute accurate decimal averages.
  • Initialize min and max variables with arr[0] to handle negative numbers correctly.
  • Single-pass algorithms can find the 1st and 2nd largest elements in linear $O(N)$ time.
  • Linear Search operates on unsorted arrays in $O(N)$ time.
  • Binary Search requires a sorted array and achieves lightning-fast $O(\log N)$ lookup speed.
โ† Prev: 28. Array Fundamentals & Memory Next: 30. Sorting, Copying & Utilities โ†’
OC
Curated by Our Compiler Java Technical Editorial Team
Published for 2026 Academic & Enterprise Reference ยท 100% Free & Open Access