>>879
next_set() 内の論理がわからなかったので書き替えました。rev() は使ってません。
void uppersort(int *a, int limit)
{   /* バブルソート:手抜き */
    for(int c=0; c<=limit; c++) {
        for(int b=1; b<=limit; b++) {
            if(a[b]>a[b-1])
                swp(a+b-1, a+b);
        }
    }
    return;
}

int next_set(int *a,int n){
    int maxi;
    for(int i=1; i<n; i++) {
        if(a[i-1]>a[i]) {    /* 昇順になっている最下桁対を見つける */
            maxi=-1;
            for(int j=0; j<i; j++) { /* 該当部を次の数字に置き換える */
                if(a[j]>a[i] && (maxi==-1 || a[j]<a[maxi]))
                    maxi=j;
            }
            swp(a+i, a+maxi);
            uppersort(a,i-1); /* 該当部より下の桁は昇順に初期化 */
            return 0;
        }
    }
    return -1;
}