分治法:
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;
}
}
3960

被折叠的 条评论
为什么被折叠?



