C C C 標準庫函式之排列函式

2021-10-04 10:09:10 字數 4024 閱讀 1557

字典次序:所謂字典次序指兩序列的元素一 一比較直至出現下列情況:

如果兩元素不相等,那麼這兩個元素的比較結果就是整個序列的比較結果;

如果兩個序列的元素數量不同,則元素較少的序列小於另乙個序列;

如果兩個序列沒有更多可以比較的元素,則兩個序列相等。

通俗來講就是 str1 < str2 等價於str1的前k-1個元素與str2的前k-1個元素相等,但str1的第k個元素小於str2的第k個元素,或者str1的元素個數小於str2的元素個數。

全排列:對於乙個含有n個元素的序列,按照一定次序對序列元素進行排列。那麼全排列數為n!。

比如序列的全排列方式共有3!= 6個,分別為,,,,,,這就是乙個字典次序的全排列。

1.標頭檔案

#include

2.函式原型

一般求乙個序列的全排列會要求按照字典次序進行排列,那麼有必要介紹一下接下來的幾個概念:

bool

next_permutation

(begin, end)

// 函式會改變[begin,end)區間內元素次序,使它們符合"下一次排列次序",預設為按字典次序公升序

bool

next_permutation

(begin, end, op)

// op為自定義排列次序

bool

prev_permutation

(begin, end)

// 函式會改變[begin,end)區間內元素次序,使它們符合"上一次排列次序",預設為按字典次序公升序

bool

prev_permutation

(begin, end, op)

// op為自定義排列次序

詳細說明:

1.next_permutation(begin, end, op )

功能:求當前序列的「下一次排序」,函式值為bool型別,若當前序列不存在下一次排序,返回false;若存在,則返回true,並且改變區間 [begin,end) 的元素次序使之符合「下一次排序」

引數:

常用形式為 next_permutation (array, array + size),可以通過設定begin與end的值使之只對序列的子串行進行排列

2.prev_permutation(begin, end, op)

功能求當前序列的「上一次排序」,函式值為bool型別,若當前序列不存在上一次排序,返回false;若存在,則返回true,並且改變區間 [begin,end) 的元素次序使之符合「上一次排序」

引數:

常用形式為 prev_permutation (array, array + size),可以通過設定begin與end的值使之只對序列的子串行進行排列

若要實現全排列,首先必須要對初始序列進行排序,使之成為字典次序中的第乙個排列方式或最後乙個排列方式,否則next_permutation() 函式和prev_permutation() 函式只能給出當前序列的下乙個或上乙個。

1.按照字典次序輸出給定字串的全部排列方式

#include

#include

#include

using

namespace std;

const

int maxn =6;

char arr[maxn]

;int main ()

cout << endl;

}return0;

}例:輸入:abc

輸出:abc acb bac bca cab cba // 偷懶~~未換行

2.按照字典次序的逆序輸出給定字串的全部排列方式

#include

#include

#include

using

namespace std;

const

int maxn =6;

char arr[maxn]

;bool compare (

char a,

char b)

int main ()

cout << endl;

}return0;

}例:輸入:abc

輸出:cba cab bca bac acb abc // 偷懶~~未換行

3.未對初始序列排序,依次求下一次排列

#include

#include

#include

using

namespace std;

const

int maxn =6;

char arr[maxn]

;int main ()

cout << endl;

}return0;

}例:輸入:bac

輸出:bac bca cab cba // 偷懶~~未換行

4.未對初始序列排序,依次求上一次排列

#include

#include

#include

using

namespace std;

const

int maxn =6;

char arr[maxn]

;int main ()

cout << endl;

}return0;

}例:輸入:bac

輸出:bac acb abc // 偷懶~~未換行

5.利用自定義排序方式,和 next_permutation 實現字典次序逆序

#include

#include

#include

using

namespace std;

bool compare (

char a,

char b)

int main ();

cout << arr << endl;

while

(next_permutation

(arr, arr +

strlen

(arr)

, compare))

cout << endl;

return0;

}結果依次為:

cbacab

bcabac

acbabc

6.利用自定義排序方式,和 prev_permutation 實現字典次序

#include

#include

#include

using

namespace std;

bool compare (

char a,

char b)

int main ();

cout << arr << endl;

while

(prev_permutation

(arr, arr +

strlen

(arr)

, compare))

cout << endl;

return0;

}結果依次為:

abcacb

bacbca

cabcba

7.對序列的子串行進行排列

#include

#include

#include

using

namespace std;

int main ();

cout << arr << endl;

while

(next_permutation

(arr, arr +3)

) cout << endl;

return0;

}結果依次為:

abcde

acbde

bacde

bcade

cabde

cbade

C 標準庫函式之排列函式

字典次序 所謂字典次序指兩序列的元素一 一比較直至出現下列情況 如果兩元素不相等,那麼這兩個元素的比較結果就是整個序列的比較結果 如果兩個序列的元素數量不同,則元素較少的序列小於另乙個序列 如果兩個序列沒有更多可以比較的元素,則兩個序列相等。通俗來講就是 str1 str2 等價於str1的前k 1...

庫函式求全排列

上級排列 prev permutation start,end 求的是當前排列的上乙個排列 對於 上乙個 和 下乙個 它們為字典序的前後,就是對於當前序列pn,他的下乙個序列pn 1,不存在另外的pm,使得pn字典序 不同排列的先後關係是從左 右逐個比較對應的數字的先後來決定的。例如 對於6個數字的...

標準庫函式實現之strstr

昨天去參加乙個面試,發現自己的 水平還是不夠,謝了兩次才寫出來,連基本的標準庫實現,都沒法做好,遂決定對標準庫中的部分函式的實現研習一番。面試的是 char strstr char s1 char s2 函式,自己寫的就不說了,寫得很爛,不過看了minix 裡面的實現思路和我一樣,linux的 中,...