原理
分治的思想:分解原问题,解决子问题,合并问题解
快排与归并:
归并排序:简化分解,侧重合并
快速排序:侧重分解,简化合并
如何分解:
基本思想:
- 任选元素x作为分界线,称为主元(pivot)
- 交换重排,满足x左侧元素小于右侧
实现方法:
- 选取固定位置主元x(如尾元素)
- 维护两个部分的右端点变量i,j
- 考察数组元A[j] ,只和主元比较
- 若A[j] <= x,则交换A[j]和A[i+1],i,j右移
- 若A[j] > x,则j右移
- 把主元放在中间作分界线
代码
public static void main(String[] args) {
int[] ary={3,2,65,61,45,65,6,674,4,2,11,45};
System.out.println(Arrays.toString(ary));
QuickSort(ary,0,ary.length-1);
System.out.println(Arrays.toString(ary));
}
public static int Partition(int[] A,int p,int r){//p为开始位置,r为终止位置
int x=A[r];//选取主元,把最后一位当作主元
int i=p-1;//i用来标识小于主元的最后一个元素的下标,开始时并没有发现小于主元的元素,所以从-1开始
for (int j=p;j<r;j++){//j与主元进行比较,
if(A[j]<=x){//比主元小的交换到前面去
int temp=A[j];
A[j]=A[i+1];
A[i+1]=temp;
i++;
}
}
//以主元作为分界线
int temp=A[r];
A[r]=A[i+1];
A[i+1]=temp;
return i+1;//返回主元位置
}
public static void QuickSort(int[] A,int p,int r){
if(p<r){
int q=Partition(A,p,r);//选择主元,排序
QuickSort(A,p,q-1);
QuickSort(A,q+1,r);
}
}
扩展
反思最差情况
- 数组划分时选取固定位置主元,可以针对性构造最差情况
解决方案
- 数组划分时选取随机位置主元,无法针对性构造最差情况