Вы можете сделать это с помощью linq, проиндексировав числа перед началом:
var nums = new[] { 5, 3, 2, 8, 1, 4 };
var indexedNums = nums.Select((num, idx) => new { num, idx }).ToList();
Затем сортируем эти проиндексированные числа по четности и коэффициентам:
var evens = indexedNums.Where(x => x.num % 2 == 0);
var odds = indexedNums.Where(x => x.num % 2 == 1);
Сортировка нечетных (проиндексированных) чисел по их значению:
var sortedOdds = odds.OrderBy(x => x.num); //sort the odd numbers by their value
Сжатие этой последовательности с последовательностью odds
(которая отсортирована по индексу), взяв число из sortedOdds
и индекс из odds
var reindexedOdds = sortedOdds.Zip(odds, (o1, o2) => new { o1.num, o2.idx });
... и выбрасываем эти reindexedOdds
в последовательность с индексом evens
сверху, сортируем по индексу и затем выбираем число.
var endSequence = evens.Concat(reindexedOdds).OrderBy(x => x.idx).Select(x => x.num);