java快速排序优化
研究java快速排序ing,目前希望做到,尽可能少的循环、交换。(求指点)
(话说回来是判断连个值大小快,还是交换两个值快。我是凭感觉,认为判断连个大小快,所以当前版本判断比较多。)
快速排序原理:从数据序列中选一个元素,并将序列中所有比该元素小的元素都放到它的右边或左边,再对左右两边分别用同样的方法处之直到每一个待处理的序列的长度为1, 处理结束。
话不多说,先上我的源码:
public static void quickSort(int[] data,int left,int right){
int split=data[right];//分割值,以这个值作为分割data的的标准。
int pointerIndex=left;//相当于指针,记录下标,指针左端的都是小于split值的,指针右端的都是大于split值的
for(int i=left;i<right;i++){
if(data[i]<split){
if(i!=pointerIndex){
data[i]=data[i]^data[pointerIndex];
data[pointerIndex]=data[i]^data[pointerIndex];
data[i]=data[i]^data[pointerIndex];
}
pointerIndex++;
}
}
//如果pointerIndex不是最右端,那么交换这两个下表对应的值。
//ps:其实,如果这两个值是相等的话可以不交换,个人感觉最好在加上一个判断data[pointerIndex]!=data[right]
//if(pointerIndex!=right){
if(pointerIndex!=right&&data[pointerIndex]!=data[right]){
data[right] = data[pointerIndex]^data[right];
data[pointerIndex]=data[right]^data[pointerIndex];
data[right]=data[right]^data[pointerIndex];
}
if(pointerIndex-1>left){//如果pointerIndex-1==left,说明左端只有一个数,那么左端就无需排序。
quickSort(data,left,pointerIndex-1);
}
if(pointerIndex+1<right){//如果pointerIndex+1==right,说明右端只有一个数,那么右端无需排序。
quickSort(data,pointerIndex+1,right);
}
}
测试代码:
public class QuickTest {
private static int iterationNumber;
private static int swapNumber;
public static void main(String[]args){
// int[] a={0,3,10,13,5,6,7,1,7,22,2,4,8,12,9};
// int[] a={0,3,10,13,5,6,7,1,7,22,2,4,8,12,29};
// int[] a={17,4,2,3,7,9,5,1,15,4,3,6,11,8,0,10,19,14,16,12,18,13};
int[] a={17,18,4,2,3,7,9,5,1,15,4,8,0,10,19,13,14,16,12,3,6,11,13};
quickSort(a,0,a.length-1);
System.out.println("iterationNumber:"+iterationNumber+" swapNumber:"+swapNumber);
System.out.println(Arrays.toString(a));
}
public static void quickSort(int[] data,int left,int right){
int split=data[right];//分割值,以这个值作为分割data的的标准。
int pointerIndex=left;//相当于指针,记录下标,指针左端的都是小于split值的,指针右端的都是大于split值的
for(int i=left;i<right;i++){
if(data[i]<split){
if(i!=pointerIndex){
data[i]=data[i]^data[pointerIndex];
data[pointerIndex]=data[i]^data[pointerIndex];
data[i]=data[i]^data[pointerIndex];
swapNumber++;
System.out.println("i="+i+" - "+data[i]+"与"+data[pointerIndex]+"交换: "+Arrays.toString(data));
}
pointerIndex++;
}
}
//如果pointerIndex不是最右端,那么交换这两个下表对应的值。
//ps:其实,如果这两个值是相等的话可以不交换,个人感觉最好在加上一个判断data[pointerIndex]!=data[right]
//if(pointerIndex!=right){
if(pointerIndex!=right&&data[pointerIndex]!=data[right]){
data[right] = data[pointerIndex]^data[right];
data[pointerIndex]=data[right]^data[pointerIndex];
data[right]=data[right]^data[pointerIndex];
swapNumber++;
System.out.println(data[right]+"与"+data[pointerIndex]+"交换: "+Arrays.toString(data));
}
if(pointerIndex-1>left){//如果pointerIndex-1==left,说明左端只有一个数,那么左端就无需排序。
iterationNumber++;
quickSort(data,left,pointerIndex-1);
}
if(pointerIndex+1<right){//如果pointerIndex+1==right,说明右端只有一个数,那么右端无需排序。
iterationNumber++;
quickSort(data,pointerIndex+1,right);
}
}
}