python
algorithm
排列(英語:permutation)是將相異物件或符號根據確定的順序重排。每個順序都稱作乙個排列。例如,從一到六的數字有720種排列,對應於由這些數字組成的所有不重複亦不闕漏的序列,例如4, 5, 6, 1, 2, 3 與1, 3, 5, 2, 4, 6。【from wikipedia】
從n個相異元素中取出 k個元素,k個元素的排列數量為:
p kn
=n!(
n−k)
!^=}}
pkn=(
n−k)
!n!
其中p意為permutation(排列),!表示階乘運算。全排列而取k為n,則結果為n!。
字典序法
字典序,就是將元素按照字典的順序(a-z, 1-9)進行排列。以字典的順序作為比較的依據,可以比較出兩個串的大小。比如 「1」 < 「13」<「14」<「153」, 就是按每個數字位逐個比較的結果。對於乙個串「123456789」, 可以知道最小的串是「123456789」,而最大的串「987654321」。這樣針對這個串以字典序法生成全排列生成全排列,就是依次生成「123456789」->「123456798」->…->「987654312」->"987654321"這樣的串。字典序法要求這乙個與下乙個有盡可能長的共同字首,也即變化限制在盡可能短的字尾上。
鄰位對換法
該演算法由johnson-trotter首先提出,是乙個能快速生成全排列的演算法。它的下乙個全排列總是上乙個全排列對換某相鄰兩位得到的。如果已知n-1個元素的排列,將n插入到排列的不同位置,就得到了n個元素的排列。用這種方法可以產生出任意n個元素的排列。這個方法有乙個缺點:為了產生n個元素的排列,我們必須知道並儲存所有n-1個元素的排列,然後才能產生出所有n階排列。
遞增進製制法
這個演算法是基於序列的遞增進製數[3]。遞增進製數是指數字的進製隨著位數的遞增而遞增。一般情況下,數字最右邊的進製是2,次右邊的進製是3,以此類推。n位遞增進製數一共包含n!個數字,所以它可以與全排列生成演算法結合在一起。
遞減進製制法
字典序法
非遞迴演算法
3.再將排列右端的遞減部分pj+1pj+2……pn倒轉,因為j右端的數字是降序,所以只需要其左邊和右邊的交換,直到中間,因此可以得到乙個新的排列p』=p1p2……pj-1pkpn……pj+2pj+1設p是集合的乙個全排列:p=p1p2……pj-1pjpj+1……pn(1≤p1,p2,……,pn≤n-1)
1.從排列的右端開始,找出第乙個比右邊數字小的數字的序號j,即j=max在pj的右邊的數字中,
找出所有比pj大的數字中最小的數字pk,即k=min
2.交換pi,pk
**
注意:#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""@author: gsharp
"""def
swap
(n,a,b)
: n[a]
,n[b]
= n[b]
,n[a]
return
none
defreverse
(n,begin):if
len(n)
> begin:
i = begin
j =len(n)-1
while i < j:
swap(n,i,j)
i +=
1 j -=
1return n
deffindmin
(n,i)
: j =
len(n)-1
k = i +
1while j > i:
if n[j]
> n[i]
and n[j]
< n[k]
: k = j
j -=
1return k
defpermut
(n):
count =
0 j =
len(n)-1
if j <1:
return n
else
:print n
count +=
1while j >=1:
i = j -
1if n[i]
< n [j]
: k = findmin(n,i)
swap (n,i,k)
reverse (n,j)
j =len(n)-1
count +=
1print n
else
: j -=
1print count
n =[1,
2,3,
4,5,
6]permut(n)
這裡只能對於具有可比較值的列表排序,對於如【『~』,』!』,』@』,』#』】無法直接排序。
初始序列必須為最小序列,否則無法列出全部排列。可先使用快速排序來排序後作為輸入。
python非遞迴全排列實現方法
剛剛開始學習python,當前看到了函式這一節。結合陣列操作,寫了個非遞迴的全排列生成。原理是插入法,也就是在乙個有n個元素的已有排列中,後加入的元素,依次在前,中,後的每乙個位置插入,生成n 1個新的全排列。因為python切割陣列或者字串,以及合併比較方便,所以,程式會節省很多 def geta...
python非遞迴全排列
剛剛開始學習python,按照廖雪峰的 看的,當前看到了函式這一節。結合陣列操作,寫了個非遞迴的全排列生成。原理是插入法,也就是在乙個有n個元素的已有排列中,後加入的元素,依次在前,中,後的每乙個位置插入,生成n 1個新的全排列。因為python切割陣列或者字串,以及合併比較方便,所以,程式會節省很...
全排列 非遞迴
description 列出所有數字1到數字n的連續自然數的排列,要求所產生的任一數字序列中不允許出現得復數字。input 輸入 n 1 n 9 output 由1 n組成的所有不重複的數字序列,每行乙個序列。sample input 3 sample output 1 2 3 1 3 2 2 1 ...