全排列構造方法

2022-09-21 17:45:02 字數 2250 閱讀 9196

全排列構造方法1——o(n2*n!)

先看看這樣的數學式子:

n!=n*(n-1)!=(n-1)*(n-1)!+(n-1)!

=(n-1)*(n-1)!+(n-2)*(n-2)!+(n-2)!

=…….

=(n-1)*(n-1)!+(n-2)*(n-2)!+…+2*2!+1*1!+1

即有 n!-1=(n-1)*(n-1)!+(n-2)*(n-2)!+…+2*2!+1*1!

對於任意的0至n!-1之間的整數都可以表示為:

an-1*(n-1)!+an-2*(n-2)!+…+a2*2!+a1*1!

其中任一相加項都可表示為aj*j!(1<=j<=n-1)。

對於4而言,用乙個變數a3來記錄它右邊比它小的數的個數,不管它處在什麼位置,這個數值都在0~3之間;

對於3而言,用乙個變數a2來記錄它右邊比它小的數的個數,不管它處在什麼位置,這個數值都在0~2之間;

對於2而言,用乙個變數a1來記錄它右邊比它小的數的個數,不管它處在什麼位置,這個數值都在0~1之間;

而1比其它數都小,只要其它數字定了,它的位置也就定了。

這樣對於1到4任一排列都可以根據各個數字的位置描述成a3 a2 a1 ,讓a3 a2 a1跟乙個數對應起來,這個數就是a3*3!+a2*2!+a1*1!。

這樣可以通過乙個迴圈(從0到n!-1)來控制輸出n!種排列。

以n=4,從0開始的第15個全排列為例,先將15轉換為a3*3!+a2*2!+a1*1!這種形式:

15 div 3!=2,a3=2,表示4的右邊比它小的數的個數為2,說明4在從左向右的第2位;

15 mod 3!=3,3 div 2!=1;a2=1,表示3的右邊比它小的數的個數為1,說明3在從左向右的第3位;

3 mod 2!=1,1 div 1!=1;a1=1,表示2右邊比它小的數的個數為1,說明3在從左向右的第4位;

4、3、2的位置都確定了,1只能在剩下的空位置上,說明15對應的全排列為1432。

[演算法描述]:

1.對於輸入的n,求出1!、2!,……,n!。

2.i從0到n!-1重複做以下的內容:

(1)將i表示成an-1*(n-1)!+an-2*(n-2)!+…+a2*2!

+a1*1!的形式:先用變數記住i的值即j:

=i,然後k從n-1到1重複做:a[k]:=j div k!

; j:=j mod k!

(2)j從n-1到1依次根據a[j]的值來填j+1,從低位向高位(對應從右向左順序)找非0位置個數直到等於a[j]+1,這個位置記為k,表示已找好右邊比當前所填數小的個數a[j],則第k位置應填j+1。

(3)輸出各個位置的值。

全排列構造方法2——o(n*n!)

當n=4時的排列:

1234 1243 1324 1342 1423 1432

2134 2143 2314 2341 2413 2431

3124 3142 3214 3241 3412 3421

4123 4132 4213 4231 4312 4321

從上面的排列可以發現以下的規律:

(1)偶數序列是由奇數序列的最後兩位交換而來,如1234的最後兩位交換後為1243,4123的最後兩位交換後為4132;

(2)除第乙個排列1234是給定的外,其它奇數排列也可由前乙個偶數序列通過以下的交換得來:對前乙個序列從第乙個數字開始找出比左邊數大的最右數,如1243為4,這個數所在的位置記為i,1243的i=3,然後再從第i個數開始找比第i-1個數大的最右數,1243為3,它的位置記為j,1243的j=4,交換a[i-1]與a[j],此時1243變為1342,跟1324不同的是從第i位直到第n位順序相反,因此對第i位到第n位進行逆序處理則得到結果;

(3)將交換規律(2)同樣對奇數序列作處理,也能得到正確的偶數序列,結果一樣,因此可以統一成乙個交換規律,即將(1)和(2)統一成(2);

交換到什麼時候結束呢?當已是完全由大到小時(i=1),則完成了交換構造。

[演算法描述]:

(1)1、2……n依次賦給a[1]至a[n],輸出第一種排列;

(2)構造下一種全排列,分四步完成:

第一步,i的初值為1,在a[1]至a[n]中搜尋找出相應的i,使i是a[k]>a[k-1]的k中最大的,即i=max;

第二步,在a[1]至a[n]中搜尋找出相應的j,使j是a[k]>a[i-1]的k中最大的,即j=max;

第三步,交換a[i-1]與a[j]形成新的序列;

第四步,對新的序列從 a[i+1]……a[n]進行逆序處理,輸出相應序列。

(3)重複(2)直到i=1時結束

排列句子的方法

一 粗讀知大意。將句子粗略地讀一遍,了解整個句子的意思。如 誰做什麼?誰怎麼樣?說了件什麼事?介紹了什麼 這樣能使我們把握住排列時的總方向。二 細讀找順序。仔細地讀幾遍,根據其意找出是按什麼順序寫的 如事情的發展順序 時間順序 方位順序 仔細地尋找句子中相關的詞語來確定順序。三 精讀巧排列。我們讀句...

排列句子的方法

一 按事情發展的順序排列有些錯亂的句子,我們在排列時,應仔細分析句與句之間的聯絡。常見的錯亂句子,往往敘述了一件完整的事,或者活動的具體過程。那麼,我們就可以按事情發展的順序來排列。如,他想,這是誰丟的,真不講衛生。他看見地上有一團白白的東西。忽然,他看見有幾個小同學在打掃操場,爭做好事。下課了,張...

排列句子方法指導

一 按事情發展順序排列 有些錯亂的句子,我們在排列時,應仔細分析句與句之間的聯絡。常見的錯亂句子,往往敘述了一件完整的事,或者活動的具體過程。那麼,我們就可以按事情發展的順序來排列。如 他想,這是誰丟的,真不講衛生。他看見地上有一團白白的東西。忽然,他看見有幾個小同學在打掃操場,爭做好事。下課了,張...