【发布时间】:2019-12-11 15:59:22
【问题描述】:
我目前正在研究使用数组列表的排序算法。我在 GitHub 上看到一个项目,用更大数组中的新(更大)元素覆盖小数组中的第一个(最小)元素,然后对小数组进行排序。
这是提供的解决方案:
public int findLarger() throws IndexingError {
int[] array = getArray();
int k = getIndex();
if (k <= 0 || k > array.length) {
throw new IndexingError();
}
int[] smallArray = new int[k];
for (int index = k; index < array.length; index++){
if (array[index] > smallArray[0]){
smallArray[0] = array[index];
Arrays.sort(smallArray);
}
}
return smallArray[0];
}
但我很难理解我创建的这种方法是否更“有效”,通过使用另一个变量而不是另一个数组?
public int findLarger() throws IndexingError {
int[] array = getArray();
int max = array[0];
for (int i = 0; i < k; i++) {
if (max < array[i]) {
max = array[i];
}
}
return max;
}
public abstract class Search {
private int[] array;
private int k;
Search(int[] array, int k) {
this.array = array;
this.k = k;
}
public int[] getArray() {
return array;
}
int getIndex() { return k; }
abstract public int findElement() throws IndexingError;
}
编辑:
if (array.length == 0 )
throw new RuntimeException("Array can't be empty");
int max = array[0];
for (int i = 0; i < array.length; i++) {
if (max < array[i]) {
max = array[i];
}
} // end of obvious solution method
return max;
}
【问题讨论】:
-
第一种方法解决了什么问题?我不认为第二种方法能解决同样的问题。
-
我不认为提供的解决方案是有效的。因为它看起来像 O(N^2 * logN)。你能提供方法
getArray()和getIndex()的实现吗? -
@kaya3 这两种方法本质上都是返回小数组中最大的元素,但处理方式不同,第一种方法只使用更大的数组,而第二种方法使用变量
-
@Naples 第一个方法循环遍历大数组中的最后 n-k 个元素,而第二个循环遍历前 k 个元素。很难看出他们怎么可能做同样的事情,因为他们甚至不使用输入的相同部分。
-
@Steyrix 刚刚用 getArray() 和 getIndex() 实现更新了问题