Hello Everyone,

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

Example:

Input: arr[] = {12, 13, 1, 10, 34, 1}

Output: The smallest element is 1 and

second Smallest element is 10

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:**

- Initialize both first and second smallest as INT_MAX
*first*=*second*= INT_MAX - Loop through all the elements.

a) If the current element is smaller than*first*, then update*first*and*second*.

b) Else if the current element is smaller than*second*then update*second*

**Implementation:**

`// 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;`

`}`

**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)