using System.Collections.Generic;
public static void Main()
var list = new List<int>{8, 7, 6, 4, 43, 23, 435, 76, 7, 7877, 5, 421, 2};
var results = MergeSplit(new Queue<int>(list));
Console.WriteLine(string.Join(", ", results));
private static Queue<int> Merge(Queue<int> left, Queue<int> right)
var result = new Queue<int>();
while (left.Count > 0 && right.Count > 0)
result.Enqueue(left.Peek() > right.Peek() ? right.Dequeue() : left.Dequeue());
foreach (var item in left)
foreach (var item in right)
private static Queue<int> MergeSplit(Queue<int> list)
var left = new Queue<int>();
var right = new Queue<int>();
for (var i = 0; i < n; i++)
left.Enqueue(list.Dequeue());
right.Enqueue(list.Dequeue());
right = MergeSplit(right);
return Merge(left, right);