单向扫描法的思路:
第一步首先定主元,一般设置为数组起始位置。
然后定义两个指针,一个是扫描指针sp,指向主元的下一个元素
一个指右侧指针bigger,指向数组最后一个元素
然后sp指针开始向右扫描,如果扫描到的元素小于主元的话sp指针向后移动sp++,否则的话 此时sp指向的元素和bigger指向的元素进行交换,然后bigger向前移动bigger--。直到sp大于bigger的时候,循环结束。
最后返回主元的正确位置,这个位置就是bigger,就是主元的左侧元素都比它小,右侧元素都比它的位置。
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);
}
}
//返回主元最终的位置
public static int partition(int[] A,int p, int r)
{
int pivot = A[p]; //一般设置p位置的元素为主元
int sp = p+1; //扫描指针 左侧指针
int bigger = r; //右侧指针
while(sp<=bigger)
{
if(A[sp] <=pivot)
{
sp++;
}else
{
swap(A,sp,bigger); //交换sp和bigger位置的元素
bigger--;
}
}
swap(A,p,bigger);
return bigger;
}