We can find the smallest and second smallest number of an integers array using the c language. This question is also important and asks by the interviewer in an interview.

Letâ€™s take an example, suppose here is an integer array iaData of 5 integers.

**int iaData[5] = {3, 5, 123, 6, 1};**

Here the smallest number is 1 and the second smallest number is 3.

A simple way to find the smallest and second smallest number is that sort the array in ascending order and pick its first and second elements. Its first element will be the smallest number and the second number will be the second smallest number. The time complexity of this solution is O(n Log n).

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | // C program to find smallest and second smallest elements #include <stdio.h> #define SIZE_ARRAY(x) sizeof(x)/sizeof(x[0]); // Size of array int main() { int iaData[5] = {3,5,123,6,1}; int ArraySize = SIZE_ARRAY(iaData); int iLoop1 =0, iLoop2 =0; for(iLoop1 = 0; iLoop1 < ArraySize;iLoop1++) { for(iLoop2 = iLoop1+1; iLoop2 < ArraySize ; iLoop2++) { if(iaData[iLoop1] > iaData[iLoop2]) { iaData[iLoop1] ^= iaData[iLoop2]; iaData[iLoop2] ^= iaData[iLoop1]; iaData[iLoop1] ^= iaData[iLoop2]; } } } // Sorted array printf("\n\nSorted Array: "); for(iLoop1 = 0; iLoop1 < ArraySize;iLoop1++) printf("%d ",iaData[iLoop1]); // First element of sorted array printf("\n\nSmallest element = %d\n",iaData[0]); //Second element of sorted array printf("\n\nSecond smallest element = %d\n\n\n",iaData[1]); return 0; } |

**OutPut:**

Above method is not better because it scans the array twice. There is also another way to find the smallest and second smallest number in a single scan of the array. The time complexity of this solution is O(n).

Here is an algorithm to find two smallest and second smallest number in one traversal.

#### The algorithm to find smallest and second smallest number:

- Create two variable iFirstSmallest and iSecondSmallest.
- Initialize both variables as INT_MAX

iFirstSmallest = INT_MAX

iSecondSmallest = INT_MAX - Loop through all the elements and perform the below task

**1).**If the current element is smaller than iFirstSmallest, then update iFirstSmallest and iSecondSmallest.

**2).**Else if the current element is smaller than iSecondSmallest then update iSecondSmallest.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <stdio.h> #include <limits.h> /* For INT_MAX */ #define SIZE_ARRAY(x) sizeof(x)/sizeof(x[0]); // Size of array int FindTwoSmallestNumber(int *piListOfData , int iSizeOfArray) { int iLoop1= 0,iLoop2 =0; int iFirstSmallest = INT_MAX; int iSecondSmallest = INT_MAX; while(iLoop1 < iSizeOfArray) { if(piListOfData[iLoop1] < iFirstSmallest) { iSecondSmallest = iFirstSmallest; iFirstSmallest = piListOfData[iLoop1]; } else if((piListOfData[iLoop1] < iSecondSmallest) && (piListOfData[iLoop1] !=iFirstSmallest )) { iSecondSmallest = piListOfData[iLoop1]; } iLoop1++; } printf("First Smallest Numbers = %d\nSecond Smallest Number = %d\n ",iFirstSmallest,iSecondSmallest); } int main() { int iaData[5] = {3,5,123,6,1}; int ArraySize = SIZE_ARRAY(iaData); FindTwoSmallestNumber(iaData,ArraySize); return 0; } |

**OutPut:**