算法导论之快排

快速排序法原理也是用了分治法,主要原理是将数组A分为A[p..q-1] 和A[q+1..r],然后调整元素使得A[p..q-1]小于等于A[q],A[q]小于等于A[q+1..r]。然后不断的递归,到最后就排序完成。

p--i是小于等于x的,i+1--j-1是大于等于x的,j--r是还未处理的

i每次从list前面往后走(i只在满足条件的当前轮加)

j是p到r的循环

package sort;

//partition(int A[],int p,int r)方法是关键,作用就是将数组分为A[p..q-1] 和A[q+1..r]  
public class QuickSort {

	void quicksortfunction(int A[],int p,int r){//
		int q;
		if(p<r){
			q=partition(A,p,r);//返回主元的位置,从主元的地方分成前后两个部分再计算
			quicksortfunction(A, p, q-1);
			quicksortfunction(A,q+1, r);
		}
	}
	
	int partition(int A[],int p,int r){
		int x=A[r];//把每次数组A的最后一个元素作为主元
		int i=p-1;//开始的时候将i 移动到数组的外面  
		for(int j=p;j<=r-1;j++){
			if(A[j]<=x){
				i++;
				swap(A, i,j);//p--i是小于等于x的,i+1--j-1是大于等于x的所以要交换下
			}
		}
		swap(A, i+1, r);//把主元放在中间好区分两边的
		return i+1;//返回主元的位置
	}
	
	void  swap( int [] A, int  firstIndex, int  secondIndex){
        int  temp = A[firstIndex];
        A[firstIndex] = A[secondIndex];
        A[secondIndex] = temp;
	}
	
	public static void main(String[] args) {
		QuickSort quicksort=new QuickSort();
		int A[]={2,8,7,1,3,5,6,4};
		quicksort.quicksortfunction(A, 0, A.length-1);
		for(int i=0;i<A.length;i++){
			System.out.print(A[i]+"  ");
		}
	}

}其中第一次分治法调用示意图如下: 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值