# Find the smallest and second smallest elements in an array

• Difficulty Level : Basic
• Last Updated : 22 Aug, 2022

Write an efficient C program to find the 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

Method 1(Simple approach)
A Simple Solution is to sort the array in increasing order. The first two elements in the sorted array would be the two smallest elements. In this approach, if the smallest element is present more than one time then we will have to use a loop for printing the unique smallest and second smallest elements.

The time complexity of this solution is O(n log n).

## C++

 //C++ simple approach to print smallest//and second smallest element.#includeusing namespace std;int main() {int arr[]={111, 13, 25, 9, 34, 1};int n=sizeof(arr)/sizeof(arr[0]);//sorting the array using//in-built sort functionsort(arr,arr+n);//printing the desired elementcout<<"smallest element is "<

## Java

 /*package whatever //do not write package name here */ import java.io.*;import java.util.*; class GFG {//Java simple approach to print smallest//and second smallest element. // Driver Codepublic static void main(String args[]){    int arr[]={111, 13, 25, 9, 34, 1};    int n=arr.length;       // sorting the array using    // in-built sort function    Arrays.sort(arr);       // printing the desired element    System.out.println("smallest element is "+arr[0]);    System.out.println("second smallest element is "+arr[1]);}} // This code is contributed by shinjanpatra

## Python3

 # Python3 simple approach to print smallest# and second smallest element. # driver code arr = [111, 13, 25, 9, 34, 1]n = len(arr)# sorting the array using# in-built sort functionarr.sort() # printing the desired elementprint("smallest element is "+str(arr[0]))print("second smallest element is "+str(arr[1])) # This code is contributed by shinjanpatra

## C#

 // C# simple approach to print smallest// and second smallest element.using System; public class GFG{  // Driver Code  static public void Main()  {    int[] arr = {111, 13, 25, 9, 34, 1};    int n = arr.Length;     // sorting the array using    // in-built sort function    Array.Sort(arr);     // printing the desired element    Console.WriteLine("smallest element is "+arr[0]);    Console.WriteLine("second smallest element is "+arr[1]);  }} // This code is contributed by kothavvsaakash

## Javascript



Output

smallest element is 1
second smallest element is 9

Time complexity: O(N*logN)
Auxiliary space: O(1)

Method 2:
A Better Solution is to scan the array twice. In the first traversal find the minimum element. Let this element be x. In the second traversal, find the smallest element greater than x.

Using this method, we can overcome the problem of Method 1 which occurs when the smallest element is present in an array more than one time.
The above solution requires two traversals of the input array.

## C++

 // C++ program to find smallest and// second smallest element in array#include using namespace std;int main(){    int arr[] = {12, 13, 1, 10, 34, 1};    int n = sizeof(arr) / sizeof(arr[0]);    int smallest = INT_MAX;    // traversing the array to find    // smallest element.    for (int i = 0; i < n; i++)    {        if (arr[i] < smallest)        {            smallest = arr[i];        }    }    cout << "smallest element is: " << smallest << endl;     int second_smallest = INT_MAX;     // traversing the array to find second smallest element    for (int i = 0; i < n; i++)    {        if (arr[i] < second_smallest && arr[i] > smallest)        {            second_smallest = arr[i];        }    }    cout << "second smallest element is: " << second_smallest << endl;    return 0;} // This code is contributed by Machhaliya Muhamma

## Java

 // Java program to find smallest and// second smallest element in arrayclass GFG {    public static void main(String args[])    {        int arr[] = { 12, 13, 1, 10, 34, 1 };        int n = arr.length;        int smallest = Integer.MAX_VALUE;        // traversing the array to find        // smallest element.        for (int i = 0; i < n; i++) {            if (arr[i] < smallest) {                smallest = arr[i];            }        }        System.out.println("smallest element is: "                           + smallest);         int second_smallest = Integer.MAX_VALUE;         // traversing the array to find second smallest        // element        for (int i = 0; i < n; i++) {            if (arr[i] < second_smallest                && arr[i] > smallest) {                second_smallest = arr[i];            }        }        System.out.println("second smallest element is: "                           + second_smallest);    }} // This code is contributed by Lovely Jain

## Python

 # python program to find smallest and second smallest element in array # import the moduleimport sys arr = [12, 13, 1, 10, 34, 1]n = len(arr)smallest = sys.maxint # traversing the array to find smallest element.for i in range(n):    if(arr[i] < smallest):        smallest = arr[i] print('smallest element is: ' + str(smallest))second_smallest = sys.maxint # traversing the array to find second smallest elementfor i in range(n):    if(arr[i] < second_smallest and arr[i] > smallest):        second_smallest = arr[i] print('second smallest element is: ' + str(second_smallest)) # This code is contributed by lokeshmvs21.

## C#

 // C# program to find smallest and// second smallest element in array using System; public class GFG{  static public void Main ()  {    int[] arr = { 12, 13, 1, 10, 34, 1 };    int n = arr.Length;    int smallest = Int32.MaxValue;    // traversing the array to find    // smallest element.    for (int i = 0; i < n; i++)    {      if (arr[i] < smallest)      {        smallest = arr[i];      }    }    Console.WriteLine("smallest element is: " + smallest);     int second_smallest = Int32.MaxValue;     // traversing the array to find second smallest    // element    for (int i = 0; i < n; i++)    {      if (arr[i] < second_smallest && arr[i] > smallest)      {        second_smallest = arr[i];      }    }    Console.WriteLine("second smallest element is: " + second_smallest);  }} // This code is contributed by kothavvsaakash

## Javascript



Output

smallest element is: 1
second smallest element is: 10

Time complexity: O(N)
Auxiliary space: O(1)

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

1) Initialize both first and second smallest as INT_MAX
first = second = INT_MAX
2) 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

Below is the implementation of the above approach:

## C++

 // C++ program to find smallest and// second smallest elements#include 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 #include /* 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 elementsimport 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*/

## Python3

 # Python program to find smallest and second smallest elementsimport math def print2Smallest(arr):     # There should be atleast two elements    arr_size = len(arr)    if arr_size < 2:        print ("Invalid Input")        return     first = second = math.inf    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 == math.inf):        print ("No second smallest element")    else:        print ('The smallest element is',first,'and', \              ' second smallest element is',second) # Driver function to test above functionarr = [12, 13, 1, 10, 34, 1]print2Smallest(arr) # This code is contributed by Devesh Agrawal

## C#

 // C# program to find smallest// and second smallest elementsusing 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



## Javascript



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)
Auxiliary Space: O(1)

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.

My Personal Notes arrow_drop_up