External Merge Sort Python
External Merge Sort Python
import tempfile
import sys
from typing import List
# class InvariantHeapNode:
# def __init__(self, element, i, j):
# self.element = element
# self.i = i
# self.j = j
class InvariantHeapNode:
def __init__(self, element, file):
self.element = element
self.file = file
class ExternalSort():
def __init__(self):
self.sorted_temp_files = []
class InvariantHeap():
def __init__(self, my_heap: List[InvariantHeapNode]):
super().__init__()
self.my_heap = my_heap
size = len(my_heap)
middle = int((size - 1) / 2)
while middle >= 0:
self.heapify(middle)
middle -= 1
def get_min(self):
if len(self.my_heap) < 1:
return f'Underflow {None}'
return self.my_heap[0] # first element is min in invariant heap
def merge_files():
array = []
result = []
obj = ExternalSort()
for temp_file in obj.sorted_temp_files:
node = temp_file.readlines().strip()
array.append(InvariantHeapNode(node, temp_file))
inv_heap = InvariantHeap(array)
while True:
root = inv_heap.get_min()
if root.element == sys.maxsize:
break
result.append(root)
file = root.file
element = file.readline().strip()
if not element:
element = sys.maxsize
else:
element = int(element)
inv_heap.replace_min(root)
return result
def main():
# runs_num = 10
# runs_size = 1000
#
# with open("/home/max/input.txt") as f:
# num_array = [int(x) for x in f.writelines().split()]
filename = '/home/max/ext_sort.txt'
files_size = 5
obj = ExternalSort()
obj.make_runs(filename, files_size)
merge_files()
if __name__ == '__main__':
main()