void swap(int index1, int index2) { ReaderAndNum temp = data[index1]; data[index1] = data[index2]; data[index2] = temp; }
public static void Merge(ref List <StreamReader> readers, ref StreamWriter writer, int nodeRamSizeMb) { int sizeMb = FindWriteSize(readers.Count, nodeRamSizeMb); int countNos = Helper.CountNosFitInSizeMb(sizeMb); Heap heap = new Heap(readers.Count * countNos); foreach (var reader in readers) { for (int i = 0; i < countNos; i++) { AddCurrentToHeap(reader, heap); } } while (!heap.IsEmpty()) { ReaderAndNum min = null; int minsCount = 0; string mins = ""; while (heap.GetMin(out min) && minsCount < countNos) { minsCount++; mins += min.num + "\n"; AddCurrentToHeap(min.reader, heap); } writer.Write(mins); } }
/// <summary> /// Most basic way to merge sorted files. Pick min from each file and take min from them. /// Output the min to output file and pick the next min from the stream that current min got picked. /// Complexity for n files of k size each: 0(n * n * k) /// </summary> /// <param name="readers"></param> /// <param name="writer"></param> public static void Merge(ref List <StreamReader> readers, ref StreamWriter writer) { List <ReaderAndNum> currentMins = new List <ReaderAndNum>(); // Create list of initial mins from each stream. foreach (var reader in readers) { AddCurrentToArray(reader, currentMins); } //write min of all mins to file and get next min from that stream while (true) { ReaderAndNum min = currentMins.First(); foreach (var pair in currentMins) { if (pair.num < min.num) { min = pair; } } writer.WriteLine(min.num); currentMins.Remove(min); AddCurrentToArray(min.reader, currentMins); if (!currentMins.Any()) { break; } } }
public bool Add(ReaderAndNum no) { if (currentIndex == Size) { return(false); } data[currentIndex] = no; HeapifyBottomUp(currentIndex); currentIndex++; return(true); }
public bool GetMin(out ReaderAndNum min) { min = null; if (currentIndex == 0) { return(false); } min = data[0]; HeapifyRoot(); currentIndex--; return(true); }
public static void Merge(ref List <StreamReader> readers, ref StreamWriter writer) { Heap heap = new Heap(readers.Count); foreach (var reader in readers) { AddCurrentToHeap(reader, heap); } while (!heap.IsEmpty()) { ReaderAndNum min = null; if (heap.GetMin(out min)) { writer.WriteLine(min.num); AddCurrentToHeap(min.reader, heap); } } }