Поиск двух минимальных элементов в массиве

Помогите =( Находится второе число, но совершенно другое, пробовал через отладчик найти, не могу понять в чем проблема.

        int[] a = new int[] { 5, 12, 13, 2, 1, 9, 15, 19, 6 };
        int oneMinValue = a[0];
        int twoMinValue = a[0];
        for (int i = 0; i < a.Length; i++)
        {
            if (oneMinValue > a[i])
            {
                oneMinValue = a[i];
            }
         else if (twoMinValue > a[i] & twoMinValue <= oneMinValue)
            {
                twoMinValue = a[i];
            }


        }

        for (int i = 0; i < a.Length; i++)
        {
            Console.WriteLine(oneMinValue);
            Console.WriteLine(twoMinValue);
        }

Ответы (2 шт):

Автор решения: Harry

Вам надо не забывать, что инвариант — oneMinValue не превышает twoMinValue.

Так что вот как должно быть...

        for (int i = 0; i < a.Length; i++)
        {
            if (twoMinValue > a[i])
            {
                twoMinValue = a[i];
            }
            if (twoMinValue < oneMinValue)
            {
                int tmp = twoMinValue;
                twoMinValue = oneMinValue;
                oneMinValue = tmp;
            }

        }

Ну и выводить в цикле совсем ни к чему:

        Console.WriteLine(oneMinValue);
        Console.WriteLine(twoMinValue);

Вот, смотрите результат.

Update

По замечанию DmitryK:

        int oneMinValue = a[0];
        int twoMinValue = a[1];

        if (twoMinValue < oneMinValue)
        {
            int tmp = twoMinValue;
            twoMinValue = oneMinValue;
            oneMinValue = tmp;
        }

        for (int i = 2; i < a.Length; i++)
        {
            if (twoMinValue > a[i])
            {
                twoMinValue = a[i];
            }
            if (twoMinValue < oneMinValue)
            {
                int tmp = twoMinValue;
                twoMinValue = oneMinValue;
                oneMinValue = tmp;
            }

        }
→ Ссылка
Автор решения: DmitryK

У вас условие никогда не выполняется.

if (twoMinValue > a[i] & twoMinValue <= oneMinValue)

Поскольку oneMinValue при проходе по массиву всегда является минимальным из уже встреченных чисел, то условие twoMinValue <= oneMinValue всегда ложное.
Должно быть что-то вроде такого:

int oneMinValue = a[0];
int twoMinValue = a[1];

if(oneMinValue > twoMinValue)
   swap(oneMinValue, twoMinValue);

for (int i = 0; i < a.Length; i++)
   if (oneMinValue > a[i])
   {  
      twoMinValue = oneMinValue;
      oneMinValue = a[i];
   }
   else
   if(twoMinValue > a[i])
      twoMinValue = a[i];
→ Ссылка