分割 ALDS1_6_B:Partition

函数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
*/




猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/80384616