全排列算法(全排列算法题)

本篇文章给大家谈谈全排列算法,以及全排列算法题对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

递归的全排列产生算法

我说说我对这段程序的大闹旁宴致理解过程。水平有限,难免纰漏。

咋一看我也理解不了,只是知道了函数第二个参数i表示首元素,第三个参数n表示尾元素。于是我开始按照数学归纳法的方式来理解(我一直觉得递归算法要按照数学归纳法的方式才好理解)。

我印象中数学归纳法的要点好像是包括如下2点:

1.初始的几种情况,即n=0,n=1的情况;

2.第k次与第k-1次间的关系,即已知第k-1次的结果启宏,如何求出第k次的结果。

放到这个问题中:

1.通过考虑n=0,n=1等的几种情况,我大概知道了这个函数的最终结果是打印出一组全排列。不过有些实现细节还没完全明白。

2.已知k-1个元素的全排列,如何求出k个元素的全排列?结合perm函数中的递归调用是把第二个参数加1,我就想出这个问题的答案了:首先确定首元素的值,这样,需要全排列的元素就少了1个,递归也就成立了。

想到这里应该就差不多了,整个算法的思路是:

从元素0开始依次确定各个元素的值,当确定了最后一个元素的值时,就打印整个数组。

最后回答下你的问题:

1.if语句就是当确定了最液银后一个元素的值后的处理;

2.两个swap实现的就是确定首元素的算法。

另外这里要用两个swap是为了保证全排列后各元素顺序不会乱,否则会出现将相同的元素swap到首位置的情况。这个结论是我又用了一次数学归纳法的思考方式才得出的。

[img]

求一算法实现有重复数字的全排列,跪谢~~

你这程序没有啥问题啊

我运行了,结果是对的啊

#include iostream.h

#include fstream.h

#include stdlib.h

#include time.h

#define MAX 10 //定义从0到9里随机取数.

int M; //随机取出的数的个数

int deep; //深度

int j=0; //增加一个计数器,跟踪最终排列所在的位置

void swap(int *a,int *b)

{

int temp;

temp=*a;

*a=*b;

*b=temp;

}

void print_it(int arr[])

{

++j;

ofstream fout("D:/test.txt",ios::app); //将结果以文本输出

foutj":";

//coutj":";

for(int i=0;iM;i++)

{

foutarr[i]" ";

//coutarr[i]" ";

}

foutendl;

//coutendl;

}

void perm( int arr[], int deep=0)

{

if(deep==M) // 如果已经排到最后

{

print_it(arr); // 打印数组

return;

}

for(int i=deep;iM;i++) // 对当前位置后的所有位置

{

swap(arr[deep],arr[i]); /返则/ 交换位置

perm(arr,deep+1); // 递归,继续后面的调用

swap(arr[deep],arr[i]); // 在交换回来,保持原磨大有的排列次序

}

}

void main()

{

cout"Input the amounts of the data:";

cinM;

srand((unsigned)time(NULL)); //srand()函数产生一个以当前时间开始漏游棚的随机种子

int *Array=new int[M];

for(int i=0;iM;i++)

{

Array[i]=rand()%MAX; //MAX为最大值,其随机域为0~MAX-1

coutArray[i]" ";

}

coutendl;

perm(Array,deep=0);

delete []Array;

}

VB全排列算法。

新建一个工程,在窗体上新建一个text1,一个command1,把以下代码复制到工程中运行试试

Option Explicit

Private List() As String

Public index, tmp$

Private Sub Command1_Click()

ReDim List(Len(Trim(Form1.Text1.Text)))

For index 猜和= 1 To Len(Trim(Form1.Text1.Text))

List(index) 蠢兆樱= Mid(Form1.Text1.Text, index, 1)

Next index

Perm List, 1, 带丛Len(Trim(Form1.Text1.Text))

End Sub

Private Sub Form_Load()

Form1.AutoRedraw = True

End Sub

Public Function Swap(ByRef Num1 As String, ByRef Num2 As String) '交换两个数

tmp = Num1

Num1 = Num2

Num2 = tmp

End Function

Public Function Perm(ByRef ListTar() As String, ByVal k As Long, ByVal m As Long)  '全排列函数

Dim i

If k  m Then

For i = 1 To m

Print ListTar(i);

Next i

Print

Else

For i = k To m

Swap ListTar(k), ListTar(i)

Perm ListTar, k + 1, m

Swap ListTar(k), ListTar(i)

Next i

End If

End Function

运行效果

重复排序算法,5个1,6个2,7个3,求最快全排列的算法

求全排列非递归算法(生成算法):

1。求出第一个排列111112222223333333并输出

2。从后向前找到第一个升序滑中s[i]s[i+1]

3。从后向前找陆陵到第一个大于s[i]的s[j]

4。将s[i]与s[j]交早让戚换

5。将s[i]以后的部分逆置,输出这个排列;

6。如已是最后一个排列333333322222211111,算法结束;否则转2。

共有排列总数为:

18!/(5!*6!*7!)=14702688 种方案

求13个数的C语言全排列算法

这是冒泡法:

#define n 13

#include "stdio.h"

int main()

{

int d=1,b;

while(d)

{ //升序,冒泡排序法

int a[n];

int j,i,x,t;

int count=0;

printf("请输入你要排序的数字:\n");

for(i=0;in;i++)

scanf("%d",a[i]);

printf("-------------------冒泡排序结果--------------------\n");

for(i=0;in-1;i++) //第i趟比较

{

count+=1;

for(j=0;jn-i-1;j++) //第i趟比较只比较前n-i-1个数字就可以了

if(a[j]a[j+1]) //第i趟比较中的两两比较n-j次

{

t=a[j+1];a[j+1]=a[j];a[j]=t; /烂并弯/两数交换

}

printf("%4d",count); //输出是第几趟排序

for(j=0;jn;j++)

printf("%3d",a[j]); //输出当前排序结果

printf("\n");

}

printf("冒泡法排序结果为:蔽铅\n");

for(i=0;in;i++)

printf("%3d",a[i]);

printf("—————————————————————————————————————\n");

printf("请选择是否继续:1 继续;2 推出。\n");

scanf("%d",b);

if(b!=1)

d--;

else

continue;

}

}

这是选择排序法:

#define n 13

#include "stdio.h"

int main()

{

int d=1,b;

while(d)

{ //升序,选择排序法,第一趟,找出最小的放到最前面,第二趟从n-1里找最小的方第二个上,依次类推是为选择

int a[n];

int j,i,p,t;

printf("请输入你要排序的数字:\n");

for(i=0;in;i++)

scanf("%d",a[i]);

printf("-------------------冒泡排序结果--------------------\n");

for(i=0;in-1;i++) //第i趟比较

{

p=i;

for(j=i+1;j10;j++)

if(a[p]a[j]) //第i趟比较中的两两比较n-j次

p=j;

if(i!=p)

{

t=a[i];a[i]=a[p];a[p]=t;

}

printf("第%d趟",i); //输出是第几趟排序

for(j=0;jn;j++)

printf("%3d",a[j]); //输出当前排序结果

printf("\n");

}

printf("选择排序结果为:\n");

for(i=0;in;i++)

printf("%3d",a[i]);

printf("\n—————————————————————————————————————\n");

printf("请选择是否继饥闷续:1 继续;2 推出。\n");

scanf("%d",b);

if(b!=1)

d--;

else

continue;

}

}

这两个够吗?

关于全排列算法和全排列算法题的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表