java快速排序,优化

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);
		}
	}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值