input: Write a python function to implement a MinHeap with insert and pop methods.
  assert min_heap.insert(3) == None
  assert min_heap.insert(5) == None
  assert min_heap.insert(1) == None
  assert min_heap.pop() == 1
  assert min_heap.pop() == 3
  assert min_heap.pop() == 5
output: class MinHeap:
      def __init__(self):
          self.heap = []
  
      def insert(self, val):
          self.heap.append(val)
          self._sift_up(len(self.heap) - 1)
  
      def pop(self):
          if len(self.heap) == 0:
              return None
          if len(self.heap) == 1:
              return self.heap.pop()
          min_val = self.heap[0]
          self.heap[0] = self.heap.pop()
          self._sift_down(0)
          return min_val
  
      def _sift_up(self, idx):
          parent_idx = (idx - 1) // 2
          if idx > 0 and self.heap[idx] < self.heap[parent_idx]:
              self.heap[idx], self.heap[parent_idx] = self.heap[parent_idx], self.heap[idx]
              self._sift_up(parent_idx)
  
      def _sift_down(self, idx):
          child_idx = 2 * idx + 1
          if child_idx >= len(self.heap):
              return
          if child_idx + 1 < len(self.heap) and self.heap[child_idx + 1] < self.heap[child_idx]:
              child_idx += 1
          if self.heap[idx] > self.heap[child_idx]:
              self.heap[idx], self.heap[child_idx] = self.heap[child_idx], self.heap[idx]
              self._sift_down(child_idx)
  
  min_heap = MinHeap()