# Find the smallest and second smallest elements in an array

Write an efficient C program to find smallest and second smallest element in an array.

Become a success story instead of just reading about them. Prepare for coding interviews at Amazon and other top product-based companies with our **Amazon Test Series**. Includes **topic-wise practice questions on all important DSA topics** along with **10 practice contests** of 2 hours each. Designed by industry experts that will surely help you practice and sharpen your programming skills. Wait no more, start your preparation today!

**Example**:

Input: arr[] = {12, 13, 1, 10, 34, 1} Output: The smallest element is 1 and second Smallest element is 10

A **Simple Solution** is to sort the array in increasing order. The first two elements in sorted array would be two smallest elements. Time complexity of this solution is O(n Log n).

A** Better Solution **is to scan the array twice. In first traversal find the minimum element. Let this element be x. In second traversal, find the smallest element greater than x. Time complexity of this solution is O(n).

The above solution requires two traversals of input array.

An** Efficient Solution** can find the minimum two elements in one traversal. Below is complete algorithm.**Algorithm:**

1) Initialize both first and second smallest as INT_MAXfirst=second= INT_MAX 2) Loop through all the elements. a) If the current element is smaller thanfirst, then updatefirstandsecond. b) Else if the current element is smaller thansecondthen updatesecond

**Implementation:**

## C++

`// C++ program to find smallest and` `// second smallest elements` `#include <bits/stdc++.h>` `using` `namespace` `std; ` `/* For INT_MAX */` `void` `print2Smallest(` `int` `arr[], ` `int` `arr_size)` `{` ` ` `int` `i, first, second;` ` ` `/* There should be atleast two elements */` ` ` `if` `(arr_size < 2)` ` ` `{` ` ` `cout<<` `" Invalid Input "` `;` ` ` `return` `;` ` ` `}` ` ` `first = second = INT_MAX;` ` ` `for` `(i = 0; i < arr_size ; i ++)` ` ` `{` ` ` `/* If current element is smaller than first` ` ` `then update both first and second */` ` ` `if` `(arr[i] < first)` ` ` `{` ` ` `second = first;` ` ` `first = arr[i];` ` ` `}` ` ` `/* If arr[i] is in between first and second` ` ` `then update second */` ` ` `else` `if` `(arr[i] < second && arr[i] != first)` ` ` `second = arr[i];` ` ` `}` ` ` `if` `(second == INT_MAX)` ` ` `cout << ` `"There is no second smallest element\n"` `;` ` ` `else` ` ` `cout << ` `"The smallest element is "` `<< first << ` `" and second "` ` ` `"Smallest element is "` `<< second << endl;` `}` `/* Driver code */` `int` `main()` `{` ` ` `int` `arr[] = {12, 13, 1, 10, 34, 1};` ` ` `int` `n = ` `sizeof` `(arr)/` `sizeof` `(arr[0]);` ` ` `print2Smallest(arr, n);` ` ` `return` `0;` `}` `// This is code is contributed by rathbhupendra` |

## C

`// C program to find smallest and second smallest elements` `#include <stdio.h>` `#include <limits.h> /* For INT_MAX */` `void` `print2Smallest(` `int` `arr[], ` `int` `arr_size)` `{` ` ` `int` `i, first, second;` ` ` `/* There should be atleast two elements */` ` ` `if` `(arr_size < 2)` ` ` `{` ` ` `printf` `(` `" Invalid Input "` `);` ` ` `return` `;` ` ` `}` ` ` `first = second = INT_MAX;` ` ` `for` `(i = 0; i < arr_size ; i ++)` ` ` `{` ` ` `/* If current element is smaller than first` ` ` `then update both first and second */` ` ` `if` `(arr[i] < first)` ` ` `{` ` ` `second = first;` ` ` `first = arr[i];` ` ` `}` ` ` `/* If arr[i] is in between first and second` ` ` `then update second */` ` ` `else` `if` `(arr[i] < second && arr[i] != first)` ` ` `second = arr[i];` ` ` `}` ` ` `if` `(second == INT_MAX)` ` ` `printf` `(` `"There is no second smallest element\n"` `);` ` ` `else` ` ` `printf` `(` `"The smallest element is %d and second "` ` ` `"Smallest element is %d\n"` `, first, second);` `}` `/* Driver program to test above function */` `int` `main()` `{` ` ` `int` `arr[] = {12, 13, 1, 10, 34, 1};` ` ` `int` `n = ` `sizeof` `(arr)/` `sizeof` `(arr[0]);` ` ` `print2Smallest(arr, n);` ` ` `return` `0;` `}` |

## Java

`// Java program to find smallest and second smallest elements` `import` `java.io.*;` `class` `SecondSmallest` `{` ` ` `/* Function to print first smallest and second smallest` ` ` `elements */` ` ` `static` `void` `print2Smallest(` `int` `arr[])` ` ` `{` ` ` `int` `first, second, arr_size = arr.length;` ` ` `/* There should be atleast two elements */` ` ` `if` `(arr_size < ` `2` `)` ` ` `{` ` ` `System.out.println(` `" Invalid Input "` `);` ` ` `return` `;` ` ` `}` ` ` `first = second = Integer.MAX_VALUE;` ` ` `for` `(` `int` `i = ` `0` `; i < arr_size ; i ++)` ` ` `{` ` ` `/* If current element is smaller than first` ` ` `then update both first and second */` ` ` `if` `(arr[i] < first)` ` ` `{` ` ` `second = first;` ` ` `first = arr[i];` ` ` `}` ` ` `/* If arr[i] is in between first and second` ` ` `then update second */` ` ` `else` `if` `(arr[i] < second && arr[i] != first)` ` ` `second = arr[i];` ` ` `}` ` ` `if` `(second == Integer.MAX_VALUE)` ` ` `System.out.println(` `"There is no second"` `+` ` ` `"smallest element"` `);` ` ` `else` ` ` `System.out.println(` `"The smallest element is "` `+` ` ` `first + ` `" and second Smallest"` `+` ` ` `" element is "` `+ second);` ` ` `}` ` ` `/* Driver program to test above functions */` ` ` `public` `static` `void` `main (String[] args)` ` ` `{` ` ` `int` `arr[] = {` `12` `, ` `13` `, ` `1` `, ` `10` `, ` `34` `, ` `1` `};` ` ` `print2Smallest(arr);` ` ` `}` `}` `/*This code is contributed by Devesh Agrawal*/` |

## Python

`# Python program to find smallest and second smallest elements` `import` `sys` `def` `print2Smallest(arr):` ` ` `# There should be atleast two elements` ` ` `arr_size ` `=` `len` `(arr)` ` ` `if` `arr_size < ` `2` `:` ` ` `print` `"Invalid Input"` ` ` `return` ` ` `first ` `=` `second ` `=` `sys.maxint` ` ` `for` `i ` `in` `range` `(` `0` `, arr_size):` ` ` `# If current element is smaller than first then` ` ` `# update both first and second` ` ` `if` `arr[i] < first:` ` ` `second ` `=` `first` ` ` `first ` `=` `arr[i]` ` ` `# If arr[i] is in between first and second then` ` ` `# update second` ` ` `elif` `(arr[i] < second ` `and` `arr[i] !` `=` `first):` ` ` `second ` `=` `arr[i];` ` ` `if` `(second ` `=` `=` `sys.maxint):` ` ` `print` `"No second smallest element"` ` ` `else` `:` ` ` `print` `'The smallest element is'` `,first,` `'and'` `\` ` ` `' second smallest element is'` `,second` `# Driver function to test above function` `arr ` `=` `[` `12` `, ` `13` `, ` `1` `, ` `10` `, ` `34` `, ` `1` `]` `print2Smallest(arr)` `# This code is contributed by Devesh Agrawal` |

## C#

`// C# program to find smallest` `// and second smallest elements` `using` `System;` `class` `GFG` `{` ` ` ` ` `/* Function to print first smallest` ` ` `and second smallest elements */` ` ` `static` `void` `print2Smallest(` `int` `[]arr)` ` ` `{` ` ` `int` `first, second, arr_size = arr.Length;` ` ` `/* There should be atleast two elements */` ` ` `if` `(arr_size < 2)` ` ` `{` ` ` `Console.Write(` `" Invalid Input "` `);` ` ` `return` `;` ` ` `}` ` ` `first = second = ` `int` `.MaxValue;` ` ` ` ` `for` `(` `int` `i = 0; i < arr_size ; i ++)` ` ` `{` ` ` `/* If current element is smaller than first` ` ` `then update both first and second */` ` ` `if` `(arr[i] < first)` ` ` `{` ` ` `second = first;` ` ` `first = arr[i];` ` ` `}` ` ` `/* If arr[i] is in between first and second` ` ` `then update second */` ` ` `else` `if` `(arr[i] < second && arr[i] != first)` ` ` `second = arr[i];` ` ` `}` ` ` `if` `(second == ` `int` `.MaxValue)` ` ` `Console.Write(` `"There is no second"` `+` ` ` `"smallest element"` `);` ` ` `else` ` ` `Console.Write(` `"The smallest element is "` `+` ` ` `first + ` `" and second Smallest"` `+` ` ` `" element is "` `+ second);` ` ` `}` ` ` `/* Driver program to test above functions */` ` ` `public` `static` `void` `Main()` ` ` `{` ` ` `int` `[]arr = {12, 13, 1, 10, 34, 1};` ` ` `print2Smallest(arr);` ` ` `}` `}` `// This code is contributed by Sam007` |

## PHP

`<?php` `// PHP program to find smallest and` `// second smallest elements` `function` `print2Smallest(` `$arr` `, ` `$arr_size` `)` `{` ` ` `$INT_MAX` `= 2147483647;` ` ` ` ` `/* There should be atleast` ` ` `two elements */` ` ` `if` `(` `$arr_size` `< 2)` ` ` `{` ` ` `echo` `(` `" Invalid Input "` `);` ` ` `return` `;` ` ` `}` ` ` `$first` `= ` `$second` `= ` `$INT_MAX` `;` ` ` `for` `(` `$i` `= 0; ` `$i` `< ` `$arr_size` `; ` `$i` `++)` ` ` `{` ` ` ` ` `/* If current element is` ` ` `smaller than first then` ` ` `update both first and` ` ` `second */` ` ` `if` `(` `$arr` `[` `$i` `] < ` `$first` `)` ` ` `{` ` ` `$second` `= ` `$first` `;` ` ` `$first` `= ` `$arr` `[` `$i` `];` ` ` `}` ` ` `/* If arr[i] is in between` ` ` `first and second then` ` ` `update second */` ` ` `else` `if` `(` `$arr` `[` `$i` `] < ` `$second` `&&` ` ` `$arr` `[` `$i` `] != ` `$first` `)` ` ` `$second` `= ` `$arr` `[` `$i` `];` ` ` `}` ` ` `if` `(` `$second` `== ` `$INT_MAX` `)` ` ` `echo` `(` `"There is no second smallest element\n"` `);` ` ` `else` ` ` `echo` `"The smallest element is "` `,` `$first` ` ` `,` `" and second Smallest element is "` ` ` `, ` `$second` `;` `}` `// Driver Code` `$arr` `= ` `array` `(12, 13, 1, 10, 34, 1);` `$n` `= ` `count` `(` `$arr` `);` `print2Smallest(` `$arr` `, ` `$n` `)` `// This code is contributed by Smitha` `?>` |

## Javascript

`<script>` `// Javascript program to find smallest and` `// second smallest elements` `function` `print2Smallest( arr, arr_size)` `{` ` ` `let i, first, second;` ` ` `/* There should be atleast two elements */` ` ` `if` `(arr_size < 2)` ` ` `{` ` ` `document.write(` `" Invalid Input "` `);` ` ` `return` `;` ` ` `}` ` ` `first=Number.MAX_VALUE ;` ` ` `second=Number.MAX_VALUE ;` ` ` `for` `(i = 0; i < arr_size ; i ++)` ` ` `{` ` ` `/* If current element is smaller than first` ` ` `then update both first and second */` ` ` `if` `(arr[i] < first)` ` ` `{` ` ` `second = first;` ` ` `first = arr[i];` ` ` `}` ` ` `/* If arr[i] is in between first and second` ` ` `then update second */` ` ` `else` `if` `(arr[i] < second && arr[i] != first)` ` ` `second = arr[i];` ` ` `}` ` ` `if` `(second == Number.MAX_VALUE )` ` ` `document.write(` `"There is no second smallest element\n"` `);` ` ` `else` ` ` `document.write(` `"The smallest element is "` `+ first + ` `" and second "` `+` ` ` `"Smallest element is "` `+ second +` `'\n'` `);` `}` ` ` `// Driver program` ` ` ` ` `let arr = [ 12, 13, 1, 10, 34, 1 ];` ` ` `let n = arr.length;` ` ` `print2Smallest(arr, n);` ` ` `</script>` |

**Output :**

The smallest element is 1 and second Smallest element is 10

The same approach can be used to find the largest and second largest elements in an array.**Time Complexity:** O(n)

**Related Article:**

Minimum and Second minimum elements using minimum comparisons

Please write comments if you find any bug in the above program/algorithm or other ways to solve the same problem.