一、分治法
将一个规模较大的问题转化为多个相同形式小规模的子问题,子问题规模较小时,可自然求解。
子问题的解可通过合并得到原问题的解。
举例:小明让小张和小李去借2000元,小张借1000,小李借1000,他们各自向朋友去借,这就是一个分治问题
二、一遍单向扫描法:
思路:用两个指针将数组划分为三个区间。
扫描指针左边是确认小于等于主元的。
扫描指针右边是确认大于主元的
一遍单向扫描法:选定第一个数组元素为主元,以它为基准,左指针开始从左边挨个扫描,若扫描到的元素比主元小或相等,则保持位置不变,若扫描到的元素比主元大,此时这个元素与右指针所指元素交换
交换之后右指针向左移动
右指针若遇到比主元大的元素,该元素保持原位置不动,右指针继续左移,若扫描到的元素比主元小,则和左指针所指位置元素交换。
重复以上步骤,直到左右指针相遇。
伪代码
伪代码
QuickSort
quickSort(A,p,r)
if(p<r)
q=partition(A,p,r)
quickSort(A,p,q-1)
quickSort(A,q+1,r)
partition(A,p,r)
pivot=A[p];
sp=p+1; //sp为扫描指针;左指针p向右移动
bigger=r //最右边元素
while(sp<=bigger);
if(A[sp]<=pivot) //扫描指针小于主元
sp++ //指针右移
else
swap(A,sp,bigger) //否则交换指针所指元素
bigger--
swap(A,p,bigger)
return bigger
代码
public class Util {
public static void main(String[] args) {
int [] arr=Util.getRandomArr(10,1,20); //数组长度为10,1-20之间随机选取10个数
Util.print(arr);
int length;
quickSort(arr,0,length-1);
Util.print(arr);
}
private static void print(int[] arr) {
// TODO Auto-generated method stub
}
private static int[] getRandomArr(int i, int j, int k) {
// TODO Auto-generated method stub
return null;
}
public static int quickSort(int A[],int p,int r){
//定义数组A,p为初始左指针,r为初始右指针
if(p<r){ //
int q=partition(A,p,r); //分隔数组的左指针与右指针 ,左边元素大于右边元素
quickSort(A,p,q-1); //左边元素大于右边元素
quickSort(A,q+1,r);
}
}
public static int partition(int A[],int p,int r){
int pivot=A[p]; //确定主元为第一个p所指的元素
int sp=p+1; //sp为扫描指针;左指针p向右移动
int bigger=r; //右指针;r为数组最右端的指针
while(sp<=bigger) //左指针扫描的元素大于有指针元素,一直继续扫描
if(A[sp]<=pivot) //如果左指针所指元素小于主元
sp++; //继续扫描
else //否则
Util.swap(A,sp,bigger); //将左指针所指元素与右指针所指元素交换
bigger--; //右指针左移
swap(A,p,bigger); //如果交换之后左指针所指元素还是大于主元
return bigger;
}