/* Returns the largest integer in the array */
int CompareToAll(int array[], int n)
{
int i, j;
bool isMax;
/* Make sure that there is at least one element in the array. */
if (n <= 0)
return -1;
for (i = n-1; i > 0; i--)
{
isMax = true;
for (j = 0; j < n; j++)
{
/* See if any value is greater. */
if (array[j] > array[i])
{
isMax = false; /* array[i] is not the largest value. */
break;
}
}
/* If isMax is true, no larger value exists; array[i] is max. */
if (isMax) break;
}
return array[i];
}
我在某处读到了这段代码,它说最好的情况是当max元素位于数组的开头。这是正确的,因为每次与第一个元素进行比较时它都会突破第二个循环,因此进行比较。但是如果最终元素到底是不是仍然是最好的情况呢?因为isMax标志在第一次运行第二次for循环后遍历所有n个元素后才会为真?如果我错了,请纠正我。
答案 0 :(得分:3)
这段代码有很多错误,很难知道从哪里开始,但是当你把它作为第三方代码呈现并有一个特定的问题时 - 让我们来看看
/* Returns the largest integer in the array */
int CompareToAll(int array[], int n)
那不是Java并且不会编译 - 让我们假设它意味着int CompareToAll(int[] array, int n)
/* Make sure that there is at least one element in the array. */
if (n <= 0)
return -1;
这意味着n是数组的长度,但没有检查n
实际上是array
的长度。考虑调用CompareToAll(new int[]{}, 100)
或CompareToAll(null, 100)
,代码将落入异常循环堆中。
接下来,考虑假设n == array.length
的逻辑。我们从最后一个元素向下运行数组i
,j
在i
的每次迭代中从第一个到最后一个运行array[i]
。一旦找到大于array[i]
的元素,内部循环就会中断,当且仅当array
大于n
的每个其他成员时,代码才会终止。因此,最佳情况是当max位于数组的第一个位置时的断言是真的,但不完整。如OP建议的那样,最好的情况也是当max元素位于数组的最后位置时,在这种情况下将执行{{1}}检查。
这是非常糟糕的代码和一个并不涵盖每个案例的断言。 OP在评论中建议它来自一本书。除非这是一个检查陈述是否完整的练习,否则我推荐一本新书。