Bash Script to Find Second Largest Number in Array
arr=(3 5 1 7 4); largest=${arr[0]}; second_largest=-999999; for num in "${arr[@]}"; do if (( num > largest )); then second_largest=$largest; largest=$num; elif (( num > second_largest && num != largest )); then second_largest=$num; fi; done; echo $second_largest.Examples
How to Think About It
Algorithm
Code
arr=(3 5 1 7 4) largest=${arr[0]} second_largest=-999999 for num in "${arr[@]}"; do if (( num > largest )); then second_largest=$largest largest=$num elif (( num > second_largest && num != largest )); then second_largest=$num fi done echo $second_largest
Dry Run
Let's trace the array (3 5 1 7 4) through the code
Initialize variables
largest=3, second_largest=-999999
Check number 5
5 > 3, so second_largest=3, largest=5
Check number 1
1 > 5? No; 1 > second_largest(3)? No; no change
Check number 7
7 > 5, so second_largest=5, largest=7
Check number 4
4 > 7? No; 4 > second_largest(5)? No; no change
| Number | largest | second_largest |
|---|---|---|
| 3 | 3 | -999999 |
| 5 | 5 | 3 |
| 1 | 5 | 3 |
| 7 | 7 | 5 |
| 4 | 7 | 5 |
Why This Works
Step 1: Track largest and second largest
We keep two variables: largest and second_largest to remember the top two numbers as we scan the array.
Step 2: Update when bigger number found
If a number is bigger than largest, we move the old largest to second_largest and update largest.
Step 3: Update second largest carefully
If a number is between largest and second_largest, we update second_largest only if it is not equal to largest.
Alternative Approaches
arr=(3 5 1 7 4) sorted=($(printf "%s\n" "${arr[@]}" | sort -nr | uniq)) echo ${sorted[1]}
declare -A seen arr=(3 5 1 7 4 5) for num in "${arr[@]}"; do seen[$num]=1; done unique=(${!seen[@]}) largest=${unique[0]} second_largest=-999999 for num in "${unique[@]}"; do if (( num > largest )); then second_largest=$largest largest=$num elif (( num > second_largest && num != largest )); then second_largest=$num fi done echo $second_largest
Complexity: O(n) time, O(1) space
Time Complexity
The script loops through the array once, so time complexity is O(n), where n is the number of elements.
Space Complexity
Only a few variables are used regardless of input size, so space complexity is O(1).
Which Approach is Fastest?
The single pass approach is fastest; sorting-based methods are slower at O(n log n) but simpler to write.
| Approach | Time | Space | Best For |
|---|---|---|---|
| Single pass tracking | O(n) | O(1) | Large arrays, best performance |
| Sorting and picking | O(n log n) | O(n) | Small arrays, simplicity |
| Unique filtering + tracking | O(n) | O(n) | Arrays with duplicates |