- // TODO: use order statistics tree https://en.wikipedia.org/wiki/Order_statistic_tree
- public static percentile(dataSet: number[], percentile: number): number {
- if (percentile < 0 && percentile > 100) {
- throw new RangeError('Percentile is not between 0 and 100');
- }
- if (Utils.isEmptyArray(dataSet)) {
- return 0;
- }
- const sortedDataSet = dataSet.slice().sort((a, b) => a - b);
- if (percentile === 0 || sortedDataSet.length === 1) {
- return sortedDataSet[0];
- }
- if (percentile === 100) {
- return sortedDataSet[sortedDataSet.length - 1];
- }
- const percentileIndexBase = (percentile / 100) * (sortedDataSet.length - 1);
- const percentileIntegerIndex = Math.floor(percentileIndexBase);
- if (!Utils.isNullOrUndefined(sortedDataSet[percentileIntegerIndex + 1])) {
- return (
- sortedDataSet[percentileIntegerIndex] +
- (percentileIndexBase - percentileIntegerIndex) *
- (sortedDataSet[percentileIntegerIndex + 1] - sortedDataSet[percentileIntegerIndex])
- );
- }
- return sortedDataSet[percentileIntegerIndex];
+export const isArraySorted = <T>(array: T[], compareFn: (a: T, b: T) => number): boolean => {
+ if (array.length <= 1) {
+ return true