快速排序的过程java



快速排序是一种效率比较高的算法。但是在网上学习的时候,发现很多解释和算法的实际过程对不上,所以呢自己细心研究了一下过程,供初学者参考。



一般的做法是选取数组最左端的数字为key,也就是比较的对象,将比key小的放到它的左边,比key大的放到它的右边,然后对左边和右边分别进行相同的做法。比如看这个例子,我们要排序的数组是{34792},首先将最左边的3作为key,第一步想要得到结果是把小于3的数字,也就是2,放到3的左边,把大于3的,也就是479,放到3的右边,479这三个数字的顺序无所谓(Fig.1)。第一次用,不知道怎么调图片大小,见谅。


实现的方法是:有左右两个指针,leftrightleft对应数组最左端的数字,right对应数组最右端的数字(Fig.1)。首先从右端看起,因为右端是要放比3大的数字,所以碰到比3小的数字我们要移动到左边,比如,right对应的是2,我们要把它移到左边去,那么移到哪个位置呢,就是left现在所在的位置,移动后的数组就变成了Fig.2所示。


网上一般的写法是交换32的位置,变成{ 24793 },但实际上代码过程里并没有体现交换的过程,那么3去哪里了呢,不要急,3还在key那里呢,最后赋值就会回来了。这里实现的代码是array[left]=array[right]。接下来,我们从左端看起,寻找比3大的数,left移到了4所在的位置(见Fig.3



那么我们要把4移到右边去,移到哪里呢,移到现在right的位置,就变成了Fig.4所示



然后再看,右边,因为right所对应的数字要比3小,而4>3,right左移一位,9大于3,再左移,7大于3,再左移,当leftright相遇的时候,我们就不用进行下去了,因为left是从左往右移动的,将对应的大于3的数字移到了右边,所以left左边的都是小于3的数字,而right右边都是大于3的数字,所以此时只要将我们的key,也就是3,放在现在right的位置就行了,也就是将right对应的4变为3,所以就变成了{23794},这就是我们想要的结果。

第一步完了之后,接下来就是递归了,和很多的文章都是一样的,我们将3左边的,也就是{2},和右边的,也就是{794},分别重复同样的方法,2就一个数,不用排,右边的{7,9,4},7作为key,右边的4小于7,要放到左边,变为了{494}left往右移动,9大于7,放到右边,变为了{499},然后leftright相遇,将key的值放进去,就变成了{479},到这里再递归分下去左右都是一个数,就不用排了,于是得到了我们想要的结果{23479}。程序在最后面。




package PaiXu;

public class KuaiSuPaiXu {
	
	
	    public static void main(String[] args){
	    	
	     int [] array =new int[]{3,4,7,9,2};
	     for(int i=0;i<array.length;i++){
	    	 System.out.print(array[i]+" ");
	     }
	     KuaiSuPaiXu a=new KuaiSuPaiXu();
	     System.out.print("\n");
	     a.sort(array, 0, array.length-1);
	     for(int j=0;j<array.length;j++){
	    	 System.out.print(array[j]+" ");
	     }
	     
	    }
	
	//固定切分
		public static int partion(int[] array ,int left, int right){
		int key =array[left];

		while(left<right){
			while(array[right]>=key&&right>left){
	
				right--;
			}
			array[left]=array[right];//将右边小于key的放到左边

			while(array[left]<=key&&right>left){
	
				left++;
			}
			array[right]=array[left];//将左边大于key的放到右边
		}
		array[right]=key;
		return right;
	}
		
		public void sort(int[] array, int left,int right){
			if(left>=right){
				return;
			}
			int index=partion(array,left,right);			
			sort(array,left,index-1);
			sort(array,index+1,right);
		}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值