不妨挑选未排序区段最左边的项为基准(key)
做两个标记,左标记,右标记
把大于key的项往右移,小于key的项往左移
当标记重合的位置就是key的位置
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<cstdlib> 7 using namespace std; 8 int read() 9 { 10 int x=0,f=1; 11 char ch=getchar(); 12 while(ch<'0'||ch>'9') 13 { 14 if(ch=='-') f=-1; 15 ch=getchar(); 16 } 17 while(ch>='0'&&ch<='9') 18 { 19 x=x*10+ch-'0'; 20 ch=getchar(); 21 } 22 return x*f; 23 } 24 void qsort(int x[],int left,int right) 25 { 26 int i=left,j=right,key=x[left]; 27 if(i>=j) return ; 28 while(i<j) 29 { 30 while(i<j&&x[j]>key) j--; 31 if(i<j) x[i++]=x[j]; 32 while(i<j&&x[i]<key) i++; 33 if(i<j) x[j--]=x[i]; 34 } 35 x[i]=key; 36 qsort(x,left,j-1); 37 qsort(x,i+1,right); 38 } 39 int main() 40 { 41 42 int a; 43 a=read(); 44 int n[a]; 45 for(int i=0;i<a;i++) n[i]=read(); 46 qsort(n,0,a-1); 47 printf("%d",n[0]); 48 for(int i=1;i<a;i++) printf(" %d",n[i]); 49 return 0; 50 }