进行快速排序最重要的就是基准数的选择,有时候基准数选择的不恰当,快速排序也是快不起来的。那么什么是基准数呢,可以理解为标杆。我们要做的就是先让基准数左边的数全小于基准数,右边的全大于基准数。需要注意的是当你选择了最右端的数作为基准数,那么就需要从最左端开始移动,反之亦然。
以6,7,5,2,1为例,我们选择最左边的6为基准数,所以从最右端开始:
第一步:i=0,j=4分别从两端开始探测,发现1<6,于是j停止,i端开始,发现7>6,停止。
第二步:当i,j均停止时,交换。
第三步:再次移动i,j,发现i,j均到了2处,i,j相遇,将基准数与此处的数交换
于是变成了2,1,5,6,7
第五步:分别对基准数左右端重复二,三操作
#include<iostream>
using namespace std;
void quick_sort(int a[], int left,int right){
if(left>right)
return;
int tmp=a[left];//用于存放基准数
int i=left;
int j=right;
while(i!=j){
while(a[j]>=tmp&&i<j)//由于选择最左端的数作为基准数,所以从最右端找起
j--;
while(a[i]<=tmp&&i<j) //i出发
i++;
if(i<j)
swap(a[i],a[j]); //交换i,j
}
a[left]=a[i];//将基准数与当前位置的数交换
a[i]=tmp;
quick_sort(a,left,i-1); //利用递归再次对左端和右端进行交换
quick_sort(a,i+1,right);
}