java快速排序,优化

Posted 暴疯禹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
		
	


以上是关于java快速排序,优化的主要内容,如果未能解决你的问题,请参考以下文章

快速排序及优化(Java实现)

java代码[No.4]—快速排序算法的三种方式及其优化

快速排序的实现及优化(Java)

Java经典算法冒泡排序

排序算法之------快速排序

排序算法 五快速排序