Поиск двух минимальных элементов в массиве
Помогите =( Находится второе число, но совершенно другое, пробовал через отладчик найти, не могу понять в чем проблема.
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];