As already suggested,
sorting really makes sense in your scenario. However, you explicitely stated
'without sorting'. Of course it could be done that way, however you have to keep sorted the candidates to lowest and highest values:
int[] a = { 10, 21, 35, 2, -4, 27, 51, 60, 1212, 34 };
int[] l = new int[3];
int[] h = new int[3];
l[0] = l[1] = l[2] = int.MaxValue;
h[0] = h[1] = h[2] = int.MinValue;
foreach (int n in a)
{
for (int j = 0; j < 2; ++j)
{
if (n < l[j])
{
for (int k = 2; k > j; --k)
l[k] = l[k - 1];
l[j] = n;
break;
}
}
for (int j = 0; j < 2; ++j)
{
if (n > h[j])
{
for (int k = 2; k > j; --k)
h[k] = h[k - 1];
h[j] = n;
break;
}
}
}
Console.WriteLine("lowest ones {0}, {1}, {2}", l[0], l[1],l[2]);
Console.WriteLine("highest ones {0}, {1}, {2}", h[0], h[1], h[2]);