public static double medianBySort(Collection<? extends Number> numbers) {

		int n = numbers.size();

		switch (n) {
		case 0:
			return Double.NaN;
		case 1:
			return numbers.iterator().next().doubleValue();
		case 2:
			Iterator<? extends Number> it = numbers.iterator();
			double a = it.next().doubleValue();
			double b = it.next().doubleValue();
			return (a + b) / 2;
		}

		Number[] array = new Number[n];
		numbers.toArray(array);
		Arrays.sort(array);
		if (MraUtils.isEven(n)) {
			return (array[n / 2 - 1].doubleValue() + array[n / 2].doubleValue()) / 2.0;
		} else {
			return array[n / 2].doubleValue();
		}
	}