```diff
--- stats.py
+++ stats.py
@@
-def median(values):
-    values = sorted(values)
-    mid = len(values) // 2
-    return values[mid]
+def median(values):
+    """
+    Return the median of a list of numeric values.
+
+    * If the list is empty, ``None`` is returned.
+    * For an odd number of elements, the middle element of the sorted list is returned.
+    * For an even number of elements, the average of the two middle elements is returned
+      as a float.
+    """
+    # Handle empty input explicitly
+    if not values:
+        return None
+
+    # Sort the values to find the middle elements
+    sorted_vals = sorted(values)
+    n = len(sorted_vals)
+    mid = n // 2
+
+    # Odd number of elements: return the middle one
+    if n % 2 == 1:
+        return sorted_vals[mid]
+
+    # Even number of elements: average the two middle ones
+    return (sorted_vals[mid - 1] + sorted_vals[mid]) / 2.0
```