方法一:先从右向左找比base小的数,再从左向右找比base大的数,最后是比base小的数在左边,比base大的数在右边。
方法二:从左向右遍历,分为 小于区--等于区--大于区,再依次递归小于区和大于区
void qSort(int *A, int l, int r){
if(l<r){
int i=l;
int j=r;
int base=A[l];
int tmp;
while(i<j){
while(i<j&&base<=A[j]){
j--;
}
while(i<j&&base>=A[i]){
i++;
}
if(i<j){
tmp=A[j];
A[j]=A[i];
A[i]=tmp;
}
}
A[l]=A[i];
A[i]=base;
qSort(A,l,i-1);
qSort(A,i+1,r);
}
}
方法二:从左向右遍历,分为 小于区--等于区--大于区,再依次递归小于区和大于区
void swap(int arr[],int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
void partition(int a[],int l, int r,int *lef,int *rgt){
int less=l-1;
int more=r;
while(l<more){
if(a[l]<a[r]){
swap(a,++less,l++);
}else if(a[l]>a[r]){
swap(a,--more,l);
}else{
l++;
}
}
swap(a,more,r);
*lef=less+1;
*rgt=more;
}
void quicksort(int a[],int l,int r ){
if(l<r){
int lef,rgt;
partition(a,l,r,&lef,&rgt);
quicksort(a,l,lef-1);
quicksort(a,rgt+1,r);
}
}