快速排序-java

分治法:

1. 算法描述

    快速排序(quick-sort)与前面介绍的归并排序(merge-sort)(见算法基础——算法导论(1))一样,使用了分治思想。下面是对一个一般的子数组A[p~r]进行快速排序的分治步骤:

① 分解:数组A[p~r]被划分为两个子数组A[p~q]和A[q+1~r],使得A[q]大于等于A[p~q]中的每个元素,且小于等于A[q+1~r]中的每个元素。(需要说明的是,我们允许A[p~q]和A[q+1~r]为空)

② 解决:对子数组A[p~q]和A[q+1~r]递归的调用快速排序。

③ 合并:因为子数组都是原址排序的,所以不需要合并操作,此时的A数组已经是排好序的。


ps:所谓原址排序是指:我们在对组进行排序的过程中 只有常数个元素被存储到数组外面。

下面给出伪代码:


可以看出,算法的关键是partiton方法的实现。下面给出它的算法实现:


直接看可能觉得很晕,我们结合实例看看它是如何工作的:



package chapter1;

import java.util.Arrays;

public class Quick_sort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int [] A={12,3,35,5,6,7,12,1,2};
		quick_sort(A,0,A.length-1);
		System.out.println(Arrays.toString(A));

	}
	
	public static void quick_sort(int [] A,int p,int r){
		if(p<r){
			int q=partition(A,p,r);
			quick_sort(A,p,q-1);
			quick_sort(A,q+1,r);
		}
		
	}
	
	public static int partition(int [] A,int p,int r){
		int x=A[r];//基准数
		int i=p-1;
		for (int j = p; j < r; j++) {
			if(A[j]<=x){
				i=i+1;
				//比x小的数A[j]向前移动
				int temp=A[i];
				A[i]=A[j];
				A[j]=temp;
			}
		}
		int tem=A[r];
		A[r]=A[i+1];
		A[i+1]=tem;
		return i+1;
	}
	
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值