日期:2014-05-20  浏览次数:20648 次

循环的效率问题
今天尝试写了个快速排序算法,把数据交换写在一个方法里。

/**
 * 完成一次数据交换,将数据分开到标识位的两侧(大的一边,小的一边)
 * 中轴位取low
 * @param data
 * @param low 需要排序的低位
 * @param high 需要排序的高位
 * @return 返回中轴位置
 */
private int onceSwap(int[] data,int low,int high){
//选取第一个元素做为中轴
int temp = data[low];
while(low<high){

//比中轴小的记录移到低端  
for(;low<high && data[high]>=temp;high--){
}
data[low] = data[high];
//比中轴大的记录移到高端 
for(;low<high && data[low]<=temp;low++){
}
data[high] = data[low];

// //比中轴小的记录移到低端  
// for(;low<high;high--){
// if(data[high]<=temp) break;
// }
// data[low] = data[high];
// //比中轴大的记录移到高端 
// for(;low<high;low++){
// if(data[low]>=temp) break;
// }
// data[high] = data[low];
}
data[low] = temp;
return low;
}

然后外面用递归调用,实现排序。
然后,我上面注释掉的一段循环,和没注释掉的循环相比较。

两段代码实现的功能应该是一样的。

但效率相差非常的大。

注释掉的  <  没注释的

差距不是一点点。是非常非常的大的。。谁知道这背后的原因吗?
------解决方案--------------------
循环体内加上if,肯定非常耗性能,javap反编译看一下应该知道了。
------解决方案--------------------
if语句要分支跳转等操作。
而你把条件放在for的条件控制中,就是多了一个条件表达式而已。
效率肯定是不同的。
------解决方案--------------------
lz你在上面两份代码上模拟下jvm的执行过程就知道了,注释的部分比不注释的部分每次执行的操作都要多,而且就像#2楼说的,if语句要进行分支跳转等操作,这肯定费时啊。