【发布时间】:2021-11-21 18:49:39
【问题描述】:
我编写了一个方法来找到我一无所知的数组中的中位数,除了它带有双精度数。它也在工作,但由于我不知道它可能有多大,我想知道我正在做的事情是否有效。 如果数组未排序而不是直接排序,我应该检查它吗? 或者,如果我无论如何都要对它进行排序,那会是一个不必要的步骤吗? 是我推荐的排序方式还是我错过了更好的方式?
//I calculate the median and return it.
public static double median(double[] vals) { //(un-)sorted Array
double median = 0;
sortedVals = Arrays.stream(vals).sorted().toArray(); //sorts low to high
int middleOfArray = (sortedVals.length) / 2 - 1;
int secondMiddleOfUnevenArray = (sortedVals.length) / 2;
if(sortedVals.length % 2 == 1) { //uneven values in Array
median = sortedVals[middleOfArray] + 1;
} else if(sortedVals.length % 2 == 0) { //even values in Array
median = (sortedVals[middleOfArray] + sortedVals[secondMiddleOfUnevenArray]) / 2;
} else {
System.out.println("Method median: error");
}
return median;
}
【问题讨论】:
-
我猜
Arrays.sort(vals)比流更好的选择 -
至于检查一个数组是否已经排序,“这会是一个不必要的步骤吗?” - 是的,我同意你的观点,特别是如果你对内容一无所知 - 我会直接去排序。根据用例,您还可以检查零长度数组以避免 sortedVals[middleOfArray] 爆炸
-
如果您真的关心性能,则根本不需要将数组排序到find a median。
-
任何下降排序库(Java 是)都将具有 O(n) 并且可能对排序输入具有单次扫描性能。因此,运行排序和检查可能需要非常接近同一时间,尤其是在输入很大的情况下,这通常是您唯一关心的情况。
标签: java arrays performance sorting