快速排序采用分治思想,对于一个典型的子数组A[p...r]进行快速排序分为三步分治过程:
算法实现的伪代码如下:
算法关键的地方在于PARTITION过程,即数组的划分过程,它实现了对子数组A[p...r]的原址重排:
用C++实现如下,对于任意需要排序的数组,参数p为0,r为size-1。
void quicksort(vector<int>& array,int p,int r) {//快速排序
int q;
if (p<r){
q=partition(array,p,r);
quicksort(array,p,q-1);
quicksort(array,q+1,r);
}
}
int partition(vector<int>& array,int p,int r){//子数组划分
int tmp;//交换中间量
int x=array[r];//数组尾,作为基准数
int i=p-1;
for(int j=p;j<=r-1;j++){
if(array[j]<=x){
i=i+1;
tmp=array[i];
array[i]=array[j];
array[j]=tmp;
}
}
//交换基准数与下标最小的大于基准数的元素
tmp=array[i+1];
array[i+1]=array[r];
array[r]=tmp;
return i+1;
}