input: from typing import List
  
  
  def sieve_of_eratosthenes(start: int, end: int) -> List[int]:
      """ Generates a list of prime numbers between two given numbers using the Sieve of Eratosthenes algorithm.
      >>> sieve_of_eratosthenes(1, 20)
      [1, 2, 3, 5, 7, 11, 13, 17, 19]
      """
output:     if start < 1:
          start = 1
      if end < start:
          return []
      
      is_prime = [True] * (end + 1)
      is_prime[0] = is_prime[1] = False
      
      for i in range(2, int(end**0.5) + 1):
          if is_prime[i]:
              for j in range(i*i, end + 1, i):
                  is_prime[j] = False
      
      primes = [i for i in range(start, end + 1) if is_prime[i]]
      return primes