今天尝试写了个快速排序算法,把数据交换写在一个方法里。
/**
* 完成一次数据交换,将数据分开到标识位的两侧(大的一边,小的一边)
* 中轴位取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语句要进行分支跳转等操作,这肯定费时啊。