如何知道数组是否几乎"排序?

时间:2018-03-28 15:59:51

标签: arrays algorithm sorting

给定一个数组,我必须决定,如果堆排序或合并排序在排序时更快,而不实际运行它们。为了做到这一点,我试图找到可能在两种情况下都会损害性能的好指标,例如数组的长度。

我发现合并排序在排序几乎排序的数组方面非常出色。从这个意义上讲,我试图找到一种很好的方法来估计几乎"几乎"对数组进行了排序,但我不知道该怎么做。

我曾考虑使用减去数组中每个连续元素的结果的方法,但我不确定这是否是解决此问题的最佳方法。例如:

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

当数组排序时,平均值的结果似乎更高,但我不确定该指标的可靠性。我相信有一个更好的方法,但我想不出任何。有什么建议吗?

1 个答案:

答案 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() - 功能。