给定一个数组,我必须决定,如果堆排序或合并排序在排序时更快,而不实际运行它们。为了做到这一点,我试图找到可能在两种情况下都会损害性能的好指标,例如数组的长度。
我发现合并排序在排序几乎排序的数组方面非常出色。从这个意义上讲,我试图找到一种很好的方法来估计几乎"几乎"对数组进行了排序,但我不知道该怎么做。
我曾考虑使用减去数组中每个连续元素的结果的方法,但我不确定这是否是解决此问题的最佳方法。例如:
public class AlmostSortedCalculator {
private static final int[] UNSORTED_ARRAY = {7, 1, 3, 9, 4, 8, 5};
private static final int[] SORTED_ARRAY = {1, 3, 4, 5, 7, 8, 9};
private static final int[] UNSORTED_ARRAY_ = {200, 20, 634, 9957, 1, 890, 555};
private static final int[] SORTED_ARRAY_ = {1, 20, 200, 555, 634, 890, 9957};
public static void main(String[] args) {
new AlmostSortedCalculator();
}
public AlmostSortedCalculator() {
calculate(SORTED_ARRAY);
calculate(UNSORTED_ARRAY);
calculate(SORTED_ARRAY_);
calculate(UNSORTED_ARRAY_);
}
private void calculate(int[] array) {
int result = 0;
for (int i = array.length - 1; i != 0; i--) {
if (i != 0) {
result += array[i] - array[i - 1];
}
}
System.out.println("The result is: " + result / array.length);
}
}
结果是:1
结果是:0
结果是:1422
结果是:50
当数组排序时,平均值的结果似乎更高,但我不确定该指标的可靠性。我相信有一个更好的方法,但我想不出任何。有什么建议吗?
答案 0 :(得分:1)
首先,我只看一看减法结果的符号:
/* returns the sign of the expression a - b */
int sign_of_subtraction_result(int a, int b) {
if ( a < b ) return -1;
if ( a > b ) return +1;
return 0;
}
您也可以调用此函数compare()
。
请注意,通常的库排序功能仅使用此信息,并且需要此类compare()
- 功能。