在數學中,字典或詞典順序(也稱為詞匯順序,字典順序,字母順序或詞典順序)是基于字母順序排列的單詞按字母順序排列的方法。這種泛化主要在于定義有序完全有序集合(通常稱為字母表)的元素的序列(通常稱為計算機科學中的單詞)的總順序。
對于數字1、2、3......n的排列,不同排列的先后關系是從左到右逐個比較對應的數字的先后來決定的。例如對于5個數字的排列 12354和12345,排列12345在前,排列12354在后。按照這樣的規定,5個數字的所有的排列中最前面的是12345,最后面的是 54321。
正文
數字也可以作為特別的字符串...這種情況下...如果我們用字典序進行比較...就有可能會出現下面這種情況...
"100"<"1000"..(加引號的目的是為了區別數字..與數字串..)
事實上呢。在計算機里...我們會這么看..和之前一樣...我們會首先比較第一個字符...
這里"1"='1'..(已經可以看到區別了..在數中..數字因為位置的不同會有不同的意義..而這里。這種分別變的不一樣了...)
..一步比較...還沒有辦法分辨出它們的大小...只好再比較之后的數...
這種情況回直到最后一次嘗試...第一個字符串已經空掉之前...
如果硬要比較的話...
空格的ascii碼值是32.(Ascii碼還是用兩位十六進制表示比較合適)
‘0’的ASCII碼值是48 所以‘100’<'1000'
例子:依次比字母, 如
字典序法
對于數字1、2、3......n的排列,不同排列的先后關系是從左到右逐個比較對應的數字的先后來決定的。例如對于5個數字的排列 12354和12345,排列12345在前,排列12354在后。按照這樣的規定,5個數字的所有的排列中最前面的是12345,最后面的是 54321。
字典序如下:
設P是的一個全排列:
1)從排列的右端開始,找出第一個比右邊數字小的數字的序號j(j從左端開始計算),即
2)在的右邊的數字中,找出所有比大的數中最小的數字,即 (右邊的數從右至左是遞增的,因此k是所有大于的數字中序號最大者)
3)對換
4)再將倒轉得到排列,這就是排列p的下一個排列。
程序源碼??
#include "stdio.h"
#include "string.h"
int* MediumToPermutation(int* piMedium, int iLen)
{
int* pFlag;
int i, j, sum;
int*piPermutation;
;
memset(pFlag,0, sizeof(int) * (iLen + 1));
{
;
while
{
if
ifbreak;
}
;
;
}
for
{
if
{
break;
}
}
delete[]pFlag;
returnpiPermutation;
}
int* PermutationToMedium(int* piPermutation, int iLen)
{
int i, j, sum;
int* piMedium;
memset
for
{
;
while
{
if;
;
}
}
returnpiMedium;
}
void NextM(int* piMedium, int iLen, int iM)
{
int i, iAdd;
while
{
{
{
;
;
}
else break;
;
}
{
{
{
}
break;
}
}
iM--;
}
}
int* Solve(int* piPermutation, int iLen, int iNext)
{
int* piResult;
int*piTmp;
int i;
piTmp =PermutationToMedium(piPermutation, iLen);
printf("對應的中介數是:");
printf("其后第 個排列對應的中介數是:",iNext);
;
delete []piTmp;
returnpiResult;
}
void CharToInt(char* pcIn, int* piOut)
{
int i, j, n;
int len =strlen(pcIn);
for
{
}
for(i = 0; i< 128; i++)
{
{
for
{
{
break;
}
}
}
}
}
void IntToChar(char* pcCmp, int* piCmp, int* piIn, char*pcOut)
{
int i, j;
{
{
{
break;
}
}
}
}
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt","w", stdout);
char in;
int next;
printf("<===================作業二(全排列的生成算法)===================>\n");
printf("請輸入排列字符串:");
{
printf("預推出其后的第幾個排列:");
printf("排列 ", in);
int *out;
CharToInt(in, out);
int* out1;
int i;
char* out2;
IntToChar(in, out, out1, out2);
printf("排列后的第 個排列是:",in, next);
printf(", out2);
printf("\n");
delete[]out1;
delete[]out2;
delete[]out;
}
return 0;
算法說明?
?設置了中介數的字典序 全排列生成算法,與遞歸直接模擬法和循環直接模擬法的最大不同是,不需要模擬有序全排列的生成過程,也就不需要逐一地生成各個全排列,只要知道初始全排列,就能根據序號(),直接得到第m個全排列,因此速度非常快。它的缺點是在生成序號()的遞增進進制數時,需要事先創建一個用來存儲n的階乘數 的數組p[],所以n的值不能太大,否則就會溢出,根據我的測試結果,當時不會溢出,當時會溢出。
設置了中介數的字典序全排列生成算法需要設置中介數,在實際應用中比較繁瑣,不如由前一個排列直接推得下一個排列方便。
參考資料 >