字典序演算法

2021-06-19 06:53:06 字數 1696 閱讀 5877

字典序排列就是按照字典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...