字典序排列就是按照字典a-z,1-9的順序給出字串的順序全排列,例如abc的全排列就是從abc一直排到cba。那麼給定乙個字串,怎麼找出恰好大於該字串的下乙個排列呢?
我們考慮如下的步驟:
1、假設字串為p1
p2….pn
,我們從後往前尋找第乙個符合pj
j+1條件的字元pj
,也就是說,p1
p2…pj-1
pjpj+1
…pn中pj
j+1並且pj+1
>pj+2
>…pn
。2、再次從後往前尋找第乙個大於pj
的字元pk,也就是說,p1
p2pj-1
pjpj+1
…pk-1
pkpk+1
…pn中從後往前pk
>pj
並且pk+1
,…pn
j,可以看出pk
也是比pj
大的數中最小的乙個,因為最差情況下k=j+1。
3、交換pj
和pk,這樣在p1
p2…pj
前j個字元變大了,pj
放到原來pk的位置上同樣符合pj+1
>…pk-1
>pj
>pk+1
…>pn
。4、為了得到恰好大於該字串的下乙個排列,我們看到從j+1之後的字串是降序排列的,我們將其翻轉,就可以得到想要的結果了。
那麼什麼時候整個過程結束呢?當再也找不到符合條件的j時,說明當前的字串已經是逆序的了,也就是字典序最大。
[cpp]
#include
int a[10],n;
int cmp(const
void *a,const
void *b)
int fac();
void fun();
void reverse(int m,int n);
void output();
int main()
qsort(a,n,sizeof(a[0]),cmp); //先將n個數排序
printf("these numbers are: \n");
for (i=0;i
printf("\n");
fun();
} return 0;
} int fac() //求n的階乘,即全排列的個數
return count;
} void fun()
} min=32767;
for (i=index1+1;i//求index2
} } temp=a[index1]; //交換a[index1],a[index2]
a[index1]=a[index2];
a[index2]=temp;
reverse(index1+1,n-1); //逆置a[index1]到a[n-1]的數
output(); //輸出
}
} void reverse(int m,int n)
} void output()
printf("\n");
}
字典序演算法
我們先看乙個例子。示例 1 2 3的全排列如下 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 我們這裡是通過字典序法找出來的。那麼什麼是字典序法呢?從上面的全排列也可以看出來了,從左往右依次增大,對這就是字典序法。可是如何用演算法來實現字典序法全排列呢?你主要看紅色字型部分...
字典序演算法
我們先看乙個例子。示例 1 2 3的全排列如下 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 我們這裡是通過字典序法找出來的。那麼什麼是字典序法呢?從上面的全排列也可以看出來了,從左往右依次增大,對這就是字典序法。可是如何用演算法來實現字典序法全排列呢?你主要看紅色字型部分...
字典序演算法
給定乙個正整數,實現乙個方法來求出離該整數最近的大於自身的 換位數 從後向前檢視逆序區域,找到逆序區域的前一位,也就是數字置換的邊界 把逆序區域的前一位和逆序區域中剛剛大於它的數字交換位置 把原來的逆序區域轉為順序 主流程,返回最近乙個大於自身的相同數字組成的整數。public static int...