《演算法之美》 遞迴與分治策略 全排列問題

2021-08-25 09:33:34 字數 1056 閱讀 7312

全排列問題:設r=是要進行排列的n個元素,ri = r –。集合x中元素的全排列記為perm(x)。(ri)perm(x)表示在全排列perm(x)的每乙個排列前加上字首ri,得到的排列。

因此,r的全排列可以歸納定義如下:

1)當n=1時,perm(r) = (r),其中r是集合r中唯一的元素;

2)當n>1時,perm(r)由:(r1)perm(r1),(r2)perm(r2),…,(rn)perm(rn)構成。

我們據此設計遞迴演算法如下:

#include

/*** 功能描述:交換兩個數的值

* 引數:

* a---數一

* b---數二 */

template

<

typename

t>

void

swap(t &a, t &b)

/**

* 功能描述:全排列

* 引數:

* data---待排列的陣列

* k---開始排列的元素在陣列中的下標

* m---結束排列的元素在陣列中的下標 */

template

<

typename

t>

void

asceperm(t data,

intk,

intm)

std::cout< }

else

} }

intmain() ;

asceperm<

int>(data, 0, 2);

system(

"pause");

return

0; }

演算法perm(data, k, m)遞迴地產生所有字首是data[0:k-1],且字尾是data[k:m]的全排列的所有排列。函式呼叫perm(data, 0, n-1)則產生data[0:n-1]的全排列。

在一般情況下,k。演算法將data[k:m]中每乙個元素分別與data[k]中元素交換;然後遞迴計算data[k+1:m]的全排列,並將計算結果作為data[0:k]的字尾。

Nearth 分治策略001 全排列演算法

全排列問題,即乙個陣列arr 5 一共5個數 如果以1為第乙個元素,對排序所得到的排列序列,即有 也可以把看成是乙個數,那麼就對排序,則所得的全排列為 總的全排列個數為 2 includeusing namespace std define max 10 int arr max int num 0 ...

遞迴演算法與分治策略

關於遞迴的學習 1 遞迴演算法的基本思想是 把規模大的 較難解決的問題變成規模較小的的問題。規模較小的問題又變成規模更小的問題,並且小到一定程度可以直接得出它的解,從而得到原來問題的解。遞迴是一種直接或間接呼叫自身的函式的一種演算法,很常用,一般用於解決三類問題 資料的定義按遞迴定義的。fibona...

遞迴之全排列演算法

假設有這樣乙個序列,找出這個序列的所有全排列。第一位有 n 種可能性,確定了第一位後就是求解剩下 n 1 個資料的排列問題,這樣就可以往下一直分解問題,直到序列結尾處,也就是終止條件。1 2 3 2 1 3 3 2 1 暫不考慮序列元素重複問題,測試序列 include using namespac...