using System;
using System.Collections.Generic;
using System.Linq;
namespace MaximumN
{
internal class Program
{
private static void Main()
{
const int n = 100000;
var arr = new double[n];
var random = new Random();
for(int i=0; i<n; i++)
{
arr[i] = random.NextDouble();
}
foreach (double a in arr.GetMaxElements().Take(10))
{
Console.WriteLine(a);
}
Console.ReadKey();
}
}
internal static class CustomExtensions
{
public static IEnumerable<double> GetMaxElements(
this IEnumerable<double> source
)
{
var usedIndices = new HashSet<int>();
int count = source.Count();
while (usedIndices.Count < count)
{
var enumerator = source.GetEnumerator();
int index = 0;
int maxIndex = 0;
double maxValue = Double.NegativeInfinity;
while(enumerator.MoveNext())
{
if(enumerator.Current>maxValue&&!usedIndices.Contains(index))
{
maxValue = enumerator.Current;
maxIndex = index;
}
index++;
}
usedIndices.Add(maxIndex);
yield return maxValue;
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpuYW1lc3BhY2UgTWF4aW11bU4KewogICAgaW50ZXJuYWwgY2xhc3MgUHJvZ3JhbQogICAgewogICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgTWFpbigpCiAgICAgICAgewogICAgICAgICAgICBjb25zdCBpbnQgbiA9IDEwMDAwMDsKICAgICAgICAgICAgdmFyIGFyciA9IG5ldyBkb3VibGVbbl07CiAgICAgICAgICAgIHZhciByYW5kb20gPSBuZXcgUmFuZG9tKCk7CiAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPG47IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYXJyW2ldID0gcmFuZG9tLk5leHREb3VibGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JlYWNoIChkb3VibGUgYSBpbiBhcnIuR2V0TWF4RWxlbWVudHMoKS5UYWtlKDEwKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQ29uc29sZS5SZWFkS2V5KCk7CiAgICAgICAgfQogICAgfQoKICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBDdXN0b21FeHRlbnNpb25zCiAgICB7CiAgICAgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxkb3VibGU+IEdldE1heEVsZW1lbnRzKAogICAgICAgICAgICB0aGlzIElFbnVtZXJhYmxlPGRvdWJsZT4gc291cmNlCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1c2VkSW5kaWNlcyA9IG5ldyBIYXNoU2V0PGludD4oKTsKICAgICAgICAgICAgaW50IGNvdW50ID0gc291cmNlLkNvdW50KCk7CiAgICAgICAgICAgIHdoaWxlICh1c2VkSW5kaWNlcy5Db3VudCA8IGNvdW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZW51bWVyYXRvciA9IHNvdXJjZS5HZXRFbnVtZXJhdG9yKCk7CiAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOwogICAgICAgICAgICAgICAgaW50IG1heEluZGV4ID0gMDsKICAgICAgICAgICAgICAgIGRvdWJsZSBtYXhWYWx1ZSA9IERvdWJsZS5OZWdhdGl2ZUluZmluaXR5OwogICAgICAgICAgICAgICAgd2hpbGUoZW51bWVyYXRvci5Nb3ZlTmV4dCgpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKGVudW1lcmF0b3IuQ3VycmVudD5tYXhWYWx1ZSYmIXVzZWRJbmRpY2VzLkNvbnRhaW5zKGluZGV4KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlID0gZW51bWVyYXRvci5DdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICBtYXhJbmRleCA9IGluZGV4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdXNlZEluZGljZXMuQWRkKG1heEluZGV4KTsKICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBtYXhWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQ==