还要加深对快排的理解吖。
还有,处理递归排序的时候,一定要搞清楚,这个函数是处理左闭右闭,还是左闭右开,还是左开右闭,还是左开右开的。在这里,qc处理的是左闭右闭的区间。
#include<cstdio>
using namespace std;
void qc(int *a,int left,int right){
if(left>=right) return;
int fir=left,las=right,key=a[left];
while(fir<las){
while(fir<las&&a[las]>=key){
las--;
}
a[fir]=a[las];
while(fir<las&&a[fir]<=key){
fir++;
}
a[las]=a[fir];//处理一次,将[left,fir)变成比key小的块,[las,right]变成比key大的块.
}
a[fir]=key;
qc(a,left,fir-1);
qc(a,fir+1,right);
}
int qck(int *a,int left,int right,int k){
int fir=left,las=right,key=a[left];
while(fir<las){
while(fir<las&&a[las]>=key){
las--;
}
a[fir]=a[las];
while(fir<las&&a[fir]<=key){
fir++;
}
a[las]=a[fir];
}
a[fir]=key;
if(fir==k) return a[k];
if(fir<k) return(qck(a,fir+1,right,k));
if(fir>k) return(qck(a,left,fir-1,k));
}
int main(void){
int a[10],t[10];
for(int i=0;i<10;i++){
scanf("%d",&a[i]);
}
printf("%d\n",qck(a,0,9,4));
for(int i=0;i<10;i++){
printf("%d ",a[i]);
}
}