全排列算法(全排列算法题)
本篇文章给大家谈谈全排列算法,以及全排列算法题对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
递归的全排列产生算法
我说说我对这段程序的大闹旁宴致理解过程。水平有限,难免纰漏。
咋一看我也理解不了,只是知道了函数第二个参数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
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;
}
}
这两个够吗?
关于全排列算法和全排列算法题的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。