(Java)我的初学者气泡排序的效率

(Java)我的初学者气泡排序的效率,java,algorithm,optimization,foreach,bubble-sort,Java,Algorithm,Optimization,Foreach,Bubble Sort,我是Java新手,我有一个关于优化的问题 如果我在if语句之前声明一个获取x.indexOf(I)+1值的变量,而不是在下面的代码中只放两次(描述了bubblesort的第一次调用,没有重复),那么速度有多快 是否值得创建一个j变量来保存x.indexOf(i)+1,而不是让函数再次运行 我还认为,我在IF中的第一个条件有点缺陷,是否可以让I从foreach中的I+1值开始 此外,必须使用ArrayList 谢谢你的回答。(还没有读过Java的编码标准,所以我猜它看起来很难看) publicst

我是Java新手,我有一个关于优化的问题

如果我在if语句之前声明一个获取
x.indexOf(I)+1
值的变量,而不是在下面的代码中只放两次(描述了bubblesort的第一次调用,没有重复),那么速度有多快

是否值得创建一个
j
变量来保存
x.indexOf(i)+1
,而不是让函数再次运行

我还认为,我在IF中的第一个条件有点缺陷,是否可以让
I
从foreach中的
I+1
值开始

此外,必须使用ArrayList

谢谢你的回答。(还没有读过Java的编码标准,所以我猜它看起来很难看)

publicstaticvoidbubbleOnce(arraylistx){
for(int i:x){
if((x.indexOf(i)!=x.size()-1)和&i>x.get(x.indexOf(i)+1)){
集合交换(x,x.indexOf(i),(x.indexOf(i)+1);
}
} 
}

使用
indexOf
是不正确的,如果
ArrayList x
包含多个
i
值,则排序方法将不正确

例如,本例:
[5,5,1]

运行程序后,返回
[5,5,1]


另外,正如tucuxi所提到的,使用
indexOf
,会降低程序的速度。

我非常确定JIT编译器使用的是什么,所以应该没有明显的区别。但如果有疑问,请自己尝试。在循环中使用indexOf是个坏主意。您的循环是O(n^2),而不是O(n)。这里有几个性能错误。JIT将正确地优化运行时执行的代码,但是无论在运行时可以进行哪些优化,速度慢的算法都会很慢。我建议您使用
List#get
而不是
List#indexOf
来解决这个问题,并多考虑一下您当前使用的算法。@Turing85编译器必须“知道”方法x.size()改变x.indexOf(I)没有副作用。所以我不认为它可以使用一个单一的呼叫。@laune true。暂时忘记了那个小细节。更不用说它也非常慢。将此应用于1M元素数组将花费永远的时间…@tucuxi,就好像在使用气泡排序时这很重要一样;)O(n³)比O(n^2)差得多。在效率问题上有这样一个性能下降是相当讽刺的。@tucuxi我知道。这是一个玩笑,把O(n^2)与O(n log(n))@PhamTrung相比,你为什么用while?
public static void bubbleOnce(ArrayList<Integer> x) {
        for(int i : x) {
            if((x.indexOf(i) != x.size()-1) && i > x.get(x.indexOf(i) + 1)) {
             Collections.swap(x, x.indexOf(i), (x.indexOf(i) + 1));       
            }
        } 
    }