當前位置:首頁 » 操作系統 » 生成排列演算法

生成排列演算法

發布時間: 2022-09-23 19:02:47

1. 遞歸全排列演算法比較 誰能幫我分析下全排列演算法的生成特點和優劣啊

生成全排列演算法有2種,一種是遞歸的,一種是非遞歸的

遞歸比較容易想一點,網上也容易搜到。非遞歸的難一點,《STL源碼剖析》這書里有很詳細的講解。

2. 編寫生成集合{1,2,...,n}排列的演算法(換位法),以集合{1,2,3}為例,說明演算法的執行過程。

http://blog.csdn.net/clamreason/article/details/7847421

3. 求高速產生隨機全排列的c(c++)演算法

我的思路是這樣的:
#include "stdafx.h"
#include<stdlib.h>
#include<time.h>
using namespace std;
void main()
{
int Array[100],i;
srand(time(NULL));
Array[0]=rand()%256;
for (i=1;i<100;i++){
Array[i]=(Array[i-1]+rand()%256);//在上一個數的基礎上加上一個隨機數
if (Array[i]>256){i--;continue;}//判斷下是不是大於256若是則重新生出
}
}

4. 關於生成1-n排列的遞歸演算法

這是一個遞歸演算法
你以123為例,畫個圖,很容易就明白了,將每一步執行的代碼寫下來
遞歸演算法只要理解了,其實很簡單,主要是有一個回溯的過程。

5. 如何生成一串數字的全排列 演算法

個人一點見解,希望對你有所幫助。
依我之見,你的對換部分出了一點點問題。只要作如下修改即可:
1、exchange 改為:
procere exchange(l,r:integer);
var
t,len:integer;
begin
if l=r then exit;
len:=r-l+1;
len:=len div 2;
for i:=1 to len do
begin
t:=a[l+i-1];
a[l+i-1]:=a[r-i+1];
a[r-i+1]:=t;
end;
end;
2、主過程中exchange(p,n)改為exchange(i+1,n)。

6. 求排列生成演算法(pascal)

選擇排序法:PROCEDURE selectsort;
VAR
i,j,k,temp:integer;
BEGIN
FOR i:=1 to n-1 DO
BEGIN
k:=i;
FOR j:=i+1 to n DO
IF a[k]>a[j]
THEN k:=j;
IF k<>i
THEN BEGIN
temp:=a[k];
a[k]:=a[i];
a[i]:=temp;
END;
END;
END; 快速排列法: procere qsort(L,R:longint);
var
i,j,mid,temp:longint;
begin
i:=L;
j:=R;
mid:=a[L+random(R-L+1)]; {隨機選擇一個數組中的數作為對比數}
repeat
while a[i]< mid do inc(i); {在左半部分尋找比中間數大的數}
while mid< a[j] do dec(j); {在右半部分尋找比中間數小的數}
if i< =j then {若找到一組與排序目標不一致的數對則交換它們}
begin
temp:=a[i];
a[i]):=a[j];
a[j]:=temp;
inc(i);dec(j); {繼續找}
end;
until i >j;
if L< j then qsort(L,j); {若未到兩個數的邊界,則遞歸搜索左右區間}
if i< R then qsort(i,R);
end;

注意:主程序中必須加randomize語句。 摘自pascal教程

7. 生成從1到n的所有排列

你的演算法第7步我沒看懂...

試了下你的程序,看了前幾行結果,然後基本上整理出了你的思路。
概括成一個遞歸:

如果要排列的數只有1個,那麼排列就是它自己。
如果要排列的數有N(N>1)個,那麼排列就是
for i=1 to n ,把i放在第一個位置,排列剩下的N-1個。

8. 設計遞歸演算法生成n個元素的所有排列對象

#include<iostream>
#include<iterator>
#include<algorithm>
using namespace std;

template<class T>
void permutation(T list[], int k, int m)
{
if (k == m)
{
(list, list + m + 1, ostream_iterator<T>(cout, "")); //將當前list排序
cout << endl;
}
else{
for (int i = k; i <= m; i++)
{
swap(list[i], list[k]); //將下標為i的元素交換到k位置,類似從list[k:m]中剔除操作
permutation(list, k + 1, m);
swap(list[i], list[k]);
}
}
}

int main(int argc, char* argv[])
{
char arr[3] = { 'a', 'b', 'c' };
cout << "排序結果如下:" << endl;
permutation(arr, 0, 2);
return 0;

}

(8)生成排列演算法擴展閱讀

遞歸,在數學與計算機科學中,是指在函數的定義中使用函數自身的方法。也就是說,遞歸演算法是一種直接或者間接調用自身函數或者方法的演算法。

通俗來說,遞歸演算法的實質是把問題分解成規模縮小的同類問題的子問題,然後遞歸調用方法來表示問題的解。

遞歸的基本原理

第一:每一級的函數調用都有自己的變數。

第二:每一次函數調用都會有一次返回。

第三:遞歸函數中,位於遞歸調用前的語句和各級被調用函數具有相同的執行順序。

第四:遞歸函數中,位於遞歸調用後的語句的執行順序和各個被調用函數的順序相反。

第五:雖然每一級遞歸都有自己的變數,但是函數代碼並不會得到復制。

9. 圓排列的圓排列生成演算法

現在已經存在很多種全排列演算法,例如字典序演算法、遞增進位制演算法、遞減進位制演算法、鄰位對換法。這里介紹一下圓排列生成的演算法。我們不妨用1、2、...、n來表示n個元素
對於 ,圓排列僅有一種。
對於 ,假設我們已經得到了n-1時的圓排列,我們由此序列來生成n的圓排列。
假設 為n-1時的其中一個圓排列,那麼我們可以將n分別插入到 後,由此生成新的n-1種排列......


對 個圓排列均進行此操作,即可生成一組新的一組排列,此排列即為n時的圓排列。

10. 求遍歷全排列的演算法

全排列的生成演算法就是對於給定的字元集,用有效的方法將所有可能的全排列無重復無遺漏地枚舉出來。

常見的有四種全排列演算法:
(A)字典序法
(B)遞增進位制數法
(C)遞減進位制數法
(D)鄰位對換法

這里著重介紹字典序法

對給定的字元集中的字元規定了一個先後關系,在此基礎上規定兩個全排列的先後是從左到右逐個比較對應的字元的先後。

[例]字元集{1,2,3},較小的數字較先,這樣按字典序生成的全排列是:123,132,213,231,312,321。

[注意] 一個全排列可看做一個字元串,字元串可有前綴、後綴。

1)生成給定全排列的下一個排列 所謂一個的下一個就是這一個與下一個之間沒有其他的。這就要求這一個與下一個有盡可能長的共同前綴,也即變化限制在盡可能短的後綴上。

[例]839647521是1--9的排列。1—9的排列最前面的是123456789,最後面的是987654321,從右向左掃描若都是增的,就到了987654321,也就沒有下一個了。否則找出第一次出現下降的位置。

熱點內容
遠景s1什麼配置 發布:2024-04-23 18:12:11 瀏覽:497
系統程序媒體存儲設備 發布:2024-04-23 18:12:09 瀏覽:821
全民槍王得到禮包都是密碼多少 發布:2024-04-23 17:55:06 瀏覽:224
如何看伺服器是否有雙網卡 發布:2024-04-23 17:55:05 瀏覽:466
紅米刷機為什麼要密碼 發布:2024-04-23 17:52:30 瀏覽:669
雲伺服器一般干什麼 發布:2024-04-23 17:44:43 瀏覽:219
java視頻入門 發布:2024-04-23 17:35:47 瀏覽:485
斯坦福大學編程範式 發布:2024-04-23 17:34:51 瀏覽:744
天賜良緣1期門禁密碼是多少 發布:2024-04-23 17:22:26 瀏覽:311
引流腳本什麼意思 發布:2024-04-23 17:16:49 瀏覽:397