函数partition(a,p,r)可以将数组a[p....r]分割成a[p...q-1]和a[q+1...r]两个部分并返回下标q的值。其中a[p...q-1]中的所有元素均小于等于a[q],a[q+1,r]中的所有元素均大于a[q].
需要两个指针i,j,i初始化为p-1,j初始化为p
j没经过一轮运算就会向后移动一个位置,从而决定每个a[i]该归入那一组
a[j]大与x时不必移动元素,直接让j向前移动一个元素,将a[j]归入“大于x的组”。
#include<iostream> #include<cstdio> using namespace std; const int maxn=1e5+5; int n,s[maxn]; int partition(int p,int r) { int x=s[r]; int i=p-1; for(int j=p;j<r;j++){ if(s[j]<=x){ i++; swap(s[i],s[j]); } } swap(s[i+1],s[r]); return i+1; } int main() { scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&s[i]); } int q=partition(0,n-1); for(int i=0;i<n;i++){ if(i){ printf(" "); } if(i==q){ printf("["); } printf("%d",s[i]); if(i==q){ printf("]"); } } printf("\n"); return 0; } /* 12 13 19 9 5 12 8 7 4 21 2 6 11 */