当前位置:首页 » 操作系统 » 生成排列算法

生成排列算法

发布时间: 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,也就没有下一个了。否则找出第一次出现下降的位置。

热点内容
ip提取源码 发布:2024-05-04 05:01:42 浏览:762
驾校报名了密码是什么 发布:2024-05-04 04:49:02 浏览:610
安卓加密的rar软件 发布:2024-05-04 04:18:30 浏览:606
聚会编程题 发布:2024-05-04 04:02:41 浏览:405
我的世界服务器自动扫地 发布:2024-05-04 03:48:41 浏览:612
4500能配什么电脑配置 发布:2024-05-04 03:22:29 浏览:592
阿U编程课堂 发布:2024-05-04 03:10:23 浏览:618
上传音乐搜音乐 发布:2024-05-04 03:10:23 浏览:601
编译器工作负载 发布:2024-05-04 03:06:09 浏览:422
摩斯编译 发布:2024-05-04 03:06:00 浏览:613