我正在编写一个冒泡选择方法,它应该使用这些凭据:
/* Write code for a Bubble Sort algorithm that starts at the right side of
* of ArrayList of Comparable objects and "bubbles" the largest item to the
* left of the list. The result should be an ArrayList arranged in descending
* order.
*/
@SuppressWarnings("unchecked")
void bubbleSort(ArrayList <Comparable> list) {
int end = list.size();
for (int i = 0 ; i < end; i++){
for (int j = end; j > 0; j--){
if ( list.get(j).compareTo(list.get(j-1)) > 0 ){
//swap
Comparable temp = list.get(j);
list.set(j,list.get(j - 1));
list.set(j - 1, temp);
//System.out.println(list);
}
}
end--;
}
}
问题是,Java会告诉我它已经超出界限。
如果我改为使用
for (int j = end - 1; j > 0; j--)
然后代码将运行,但它不会运行列表运行所需的次数以完全完成排序(也就是说它会停止一个循环)
答案 0 :(得分:1)
如上所述,您需要从end-1开始,否则您将访问超出数组的范围。
假设你有一个整数数组:5 1 4
您的算法将执行此操作:
第一次迭代 - &gt; i = 0 / j从2开始
1 5 4
第二次迭代 - &gt; i = 1 / j从1开始
现在只比较5和1而不切换它们,因为5更高。那么,4和5?他们应该互换。你的算法实现是错误的。
如果删除end--;
,它应该有效。
但是,这可以进行优化
答案 1 :(得分:0)
使用此代码,它可以满足您在数组实现中的要求,其中 size 是您的数组长度。
for (int i = 0; i < size - 1; j++) {
for (int j = i + 1; j < size - 1; k++){
if (array[i] > array[j]) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
答案 2 :(得分:0)
如果数组长3,则数组[3]超出范围。 由于你从数组[lenght]开始,你必须在进入for循环之前减少它,就像你提供的代码一样。
答案 3 :(得分:0)
使用end - 1
将比较列表中的最后和倒数第二个值
如果您使用end
,它会尝试比较最后一个值的最后一个值和值,这将给出ArrayOutOfBound Exception
。
现在要获得正确的输出,您必须按照以下所示删除end--;
行
for (int i = 0 ; i < end; i++){
for (int j = end -1; j > 0; j--){
if ( list.get(j).compareTo(list.get(j-1)) > 0 ){
//swap
Comparable temp = list.get(j);
list.set(j,list.get(j - 1));
list.set(j - 1, temp);
}
}
//remove below line
end--;
}
这也会使列表从右侧缩短一个值。所以删除这将工作