private static List <T> Merge <T>(List <T> list, int chunkCount, int chunkSize, IComparer <T> comparer) { int[] chunkIndexes = new int[chunkCount]; int[] chunkEnds = new int[chunkCount]; for (int i = 0; i < chunkCount; i++) { chunkIndexes[i] = i * chunkSize; chunkEnds[i] = i * chunkSize + chunkSize; } chunkEnds[chunkEnds.Length - 1] = list.Count; MinHeap <int> heap = new MinHeap <int>(chunkCount, new SelectComparer <int, T>(i => list[chunkIndexes[i]], comparer)); for (int i = 0; i < chunkCount; i++) { heap.Add(i); } List <T> result = new List <T>(list.Count); for (int i = 0; i < list.Count; i++) { result.Add(list[chunkIndexes[heap.Root]]); chunkIndexes[heap.Root]++; if (chunkIndexes[heap.Root] == chunkEnds[heap.Root]) { heap.Extract(); } else { heap.DownHeap(); } } return(result); }