diff --git a/Maths/CalculateMedian.ts b/Maths/CalculateMedian.ts new file mode 100644 index 00000000..5a6c98bc --- /dev/null +++ b/Maths/CalculateMedian.ts @@ -0,0 +1,25 @@ +/** + * @function calculateMedian + * @description This function will find the median value of an array of numbers. + * @param {number[]} numbers Sorted array of numeric values. + * @return {number} The median of input numbers. + * @see https://en.wikipedia.org/wiki/Median + * @example calculateMedian([1, 2, 4, 5, 8]) = 4 + * @example calculateMedian([1, 2, 4, 5]) = 3 + */ + +export const calculateMedian = (numbers: number[]): number => { + if (numbers.length < 1) { + throw new TypeError("Input array must contain at least one number."); + } + + const totalNumbers = numbers.length; + + if (totalNumbers % 2 === 0) { + let index = totalNumbers / 2; + return (numbers[index - 1] + numbers[index]) / 2; + } else { + let index = (totalNumbers + 1) / 2; + return numbers[index - 1]; + } +}; diff --git a/Maths/test/CalculateMedian.test.ts b/Maths/test/CalculateMedian.test.ts new file mode 100644 index 00000000..e34a71e1 --- /dev/null +++ b/Maths/test/CalculateMedian.test.ts @@ -0,0 +1,23 @@ +import { calculateMedian } from "../CalculateMedian"; + +describe("Tests for CalculateMedian", () => { + it("should be a function", () => { + expect(typeof calculateMedian).toEqual("function"); + }); + + it("should throw error for invalid input", () => { + expect(() => calculateMedian([])).toThrowError( + "Input array must contain at least one number." + ); + }); + + it("should return the median of an array of numbers - even length", () => { + const medianFunction = calculateMedian([1, 2, 3, 4]); + expect(medianFunction).toBe(2.5); + }); + + it("should return the median of an array of numbers - odd length", () => { + const medianFunction = calculateMedian([1, 2, 3, 4, 6, 8, 9]); + expect(medianFunction).toBe(4); + }); +});