1.解释
数组a=[6,4,2,5,8,9,1,3,4,7]
快排一般是将第一个元素6作为基准元素,另一个指针指向末尾的元素7,然后比较这两个数大小,比6大不变,比6小交换。发现不交换,让指向7的指针往前移,发现交换,让前面的指针往后移(首先由后往前搜索,直到找到比基准值小的,就换到前面的指针,再由前往后搜索,直到找到比基准值大的,换到后面的指针,这样循环)。直到左边的数都比基准值小,右边的都比基准值大,完成一次遍历。接下来就是以第一次基准值为分界线,分成两个数组,重复之前的动作。
以下是a数组的例子
a=[6,4,2,5,8,9,1,3,4,7]
第一次排序
以6为基准值
a=[4,4,2,5,3,1,6,9,8,7] 6左边都比6小,右边都比6大
第二次排序
6左边的数组aleft=[4,4,2,5,3,1]
以4为基准
aleft=[1,4,2,3,4,5] 第二个4是基准
6右边的数组aright=[9,8,7]
以9为基准
aright=[7,8,9]
所以第二次排序的数组a=[1,4,2,3,4,5,6,7,8,9]
第三次排序
对于aleft=[1,4,2,3,4,5]的
第二个4左边的数组aleftl=[1,4,2,3]---->aleftl=[1,4,2,3]
第二个4右边的数组aleftr=[5]---->aleftl=[5]
对于aright=[7,8,9]
以9分界
9左边的arightl=[7,8]---->arightl=[7,8]
9右边的arightr=[]---->arightl=[]
依此类推
‘
‘
‘’’’
2.C++实现代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//默认数组的第一个数作为参照点
void quicksort(int a[],int left,int right){
if(left < right){
int p=a[left]; //第一次的参照点
int l=left;
int r=right;
//直到找到比基准值大的
while(true){
while(a[l] <= p){
l++;
if (l == right){
break;
}
}
//直到找到比基准值大的
while(a[r] >= p){
r--;
if (r == left){
break;
}
}
if (l >= r) break;
int temp=a[r];
a[r]=a[l];
a[l]=temp;
}
a[left] = a[r];
a[r] = p;
quicksort(a,left,r-1);
quicksort(a,r+1,right);
}
}
int main(){
int a[]={3,6,2,1,8,3,2,5,6};
int len = sizeof(a)/sizeof(int);
quicksort(a,0,len-1);
//输出这个数组
for(int i=0 ; i<len ; i++){
cout<<a[i]<<",";
}
cout<<endl;
return 0;
}