Java:使用2个数组查找数组的第K个最大元素

时间:2018-10-07 15:57:54

标签: java arrays sorting for-loop int

以下是有关算法/解决方案的说明:

  • 输入:一个整数数组和一个数组索引
  • 输出:数组的第K个最大元素
  • 将前K个元素读入辅助数组(迄今为止找到的K个最大元素)
  • 排序K元素数组
  • 然后:

     for each remaining element {
        if (if it is smaller than the smallest element of the aux. array) {
            throw it away
        } else { 
            remove the current smallest element of the auxiliary array
            place the element into the correct position in the auxiliary array
        }
     }
    
     then return the smallest (the Kth) element of the auxiliary array
    

我提出了以下解决方案:

public int findElement() throws IndexingError {
    int[] bigArray = getArray();
    int k = getIndex();
    if (k <= 0 || k > bigArray.length) {
        throw new IndexingError();
    }

    int[] smallArray = Arrays.copyOfRange(bigArray,0,k-1);
    Arrays.sort(smallArray);


    for (int i = k; i < bigArray.length; i++) {
        for (int ii = 1; ii < smallArray.length; ii++) {
            smallArray[ii-1] = smallArray[ii];
            if (bigArray[i] > smallArray[ii]) {
                smallArray[ii] = bigArray[i];
                System.out.println(smallArray[ii] + " " + smallArray[ii-1] + " " + bigArray[i]);
                break;

            }
        }

    }

    return smallArray[0];
}

例如:

代码应根据以下信息返回值:8。

array = [2, 3, 8, 7, 1, 6, 5, 9, 4, 0]
k = 2

运行上面的代码每次都会产生不同的输出,如果运行足够的次数,您将得到正确的答案?

有人可以识别/修复我的代码中的缺陷吗?

1 个答案:

答案 0 :(得分:0)

您需要解决以下问题:

  1. Arrays.copyOfRange(array, from, to)方法中,to索引是排他的。因此,您需要像Arrays.copyOfRange(bigArray,0,k)这样,才能将第一个k元素复制到辅助数组中。
  2. 循环遍历主数组中其余数组元素并更新辅助数组的逻辑是错误的。

例如,让辅助数组为[4, 6],下一个主数组元素为2。根据您的逻辑,辅助数组将更新为[6, 6],因为您首先将索引1处的元素复制到辅助数组中的索引0,然后检查新元素(来自main数组)大于辅助数组中索引1处的元素。在这种情况下,新元素较小,因此仅发生复制,并且我们的辅助数组已损坏。

您只需要做的是,对于主数组中的每个新元素,检查它是否大于辅助数组中的第一个元素。如果是,则此新元素应该是辅助数组的一部分,并应放置在正确的位置。您可以使用气泡排序技术找到合适的位置。

public int findElement() throws IndexingError {
    int[] bigArray = getArray();
    int k = getIndex();
    if (k <= 0 || k > bigArray.length) {
        throw new IndexingError();
    }

    int[] smallArray = Arrays.copyOfRange(bigArray,0,k);
    Arrays.sort(smallArray);


    for (int i = k; i < bigArray.length; i++) {
        if(bigArray[i] > smallArray[0]) {
            smallArray[0] = bigArray[i];
            int j = 0;
            while((j < k-1) && (smallArray[j] > smallArray[j+1])) {
                swap(smallArray[j], smallArray[j+1]);
                j++;
            }
        }

    }

    return smallArray[0];
}