(Java)我的初学者气泡排序的效率
我是Java新手,我有一个关于优化的问题 如果我在if语句之前声明一个获取(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
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));
}
}
}