我在排序数组时有一点疑问,是的,我是编程的新手。看一下这段代码,例如:
public void bubbleSort(int[] array) {
boolean swapped = true;
int j = 0;
int tmp;
while (swapped) {
swapped = false;
j++;
for (int i = 0; i < array.length - j; i++) {
if (array[i] > array[i + 1]) {
tmp = array[i];
array[i] = array[i + 1];
array[i + 1] = tmp;
swapped = true;
}
}
}
在上面的代码中,为什么我们必须使用j++
和i < (array.length-j)
作为测试表达式?我们可能宁愿使用i < (array.length)
作为测试表达式,同时省略变量j
。有什么答案吗?
答案 0 :(得分:0)
“为什么我们必须使用j ++和i&lt;(array.length-j)作为测试表达式?”
背后的原因是元素array[ array.length -j ]
到array[array.length - 1]
已经排序。
示例:假设您有长度为n
的数组。
因此,在第一次迭代后,最大的元素将被放置在array[n - 1]
因为最大的元素已经在下一次迭代中排序,我们只会对长度为n - 1
的数组进行排序。
第二次迭代后,第二大元素将放在array[ n - 2]
。
因为第一个最大和第二大元素已经在下一次迭代中排序,我们只会对长度为n - 2
的数组进行排序,依此类推......
正如你所说,我们可以使用i < (array.length - 1)
,但我们只会做很多工作。如果我们这样做,运行时间将是(n n),即O(n n)。但是虽然运行时间仍然是O(n * n)但很明显小于,因此第一个是有效的。