算法排列
Ⅰ 排列算法
你的问题问的不清楚
Ⅱ 算法排序—冒泡排序
cout<<int_array[i]<<endl;相当于printf("%d /n",int_array[i]);
cout<<endl;就是输出一个换行符。
Ⅲ 求一个排列组合的算法
有个c++ stl函数叫做next_permutation。。。
#include<algorithm>
usingnamespacestd;
constintmaxn=20;
intA[maxn];
intmain(){
intn;scanf("%d",&n);
for(inti=0;i<n;++i)A[i]=i+1;
intsum=1;for(inti=1;i<=n;++i)sum*=i;
for(intj=0;j<sum;++j){
next_permutation(A,A+n);
for(inti=0;i<n;++i)printf("%d",A[i]);putchar(' ');
}
return0;
}
这个是输入n,输出n的全排列。。
有问题可问。。
Ⅳ 排序算法有多少种
排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。
排序就是把集合中的元素按照一定的次序排序在一起。一般来说有升序排列和降序排列2种排序,在算法中有8中基本排序:
(1)冒泡排序;
(2)选择排序;
(3)插入排序;
(4)希尔排序;
(5)归并排序;
(6)快速排序;
(7)基数排序;
(8)堆排序;
(9)计数排序;
(10)桶排序。
插入排序
插入排序算法是基于某序列已经有序排列的情况下,通过一次插入一个元素的方式按照原有排序方式增加元素。这种比较是从该有序序列的最末端开始执行,即要插入序列中的元素最先和有序序列中最大的元素比较,若其大于该最大元素,则可直接插入最大元素的后面即可,否则再向前一位比较查找直至找到应该插入的位置为止。插入排序的基本思想是,每次将1个待排序的记录按其关键字大小插入到前面已经排好序的子序列中,寻找最适当的位置,直至全部记录插入完毕。执行过程中,若遇到和插入元素相等的位置,则将要插人的元素放在该相等元素的后面,因此插入该元素后并未改变原序列的前后顺序。我们认为插入排序也是一种稳定的排序方法。插入排序分直接插入排序、折半插入排序和希尔排序3类。
冒泡排序
冒泡排序算法是把较小的元素往前调或者把较大的元素往后调。这种方法主要是通过对相邻两个元素进行大小的比较,根据比较结果和算法规则对该二元素的位置进行交换,这样逐个依次进行比较和交换,就能达到排序目的。冒泡排序的基本思想是,首先将第1个和第2个记录的关键字比较大小,如果是逆序的,就将这两个记录进行交换,再对第2个和第3个记录的关键字进行比较,依次类推,重复进行上述计算,直至完成第(n一1)个和第n个记录的关键字之间的比较,此后,再按照上述过程进行第2次、第3次排序,直至整个序列有序为止。排序过程中要特别注意的是,当相邻两个元素大小一致时,这一步操作就不需要交换位置,因此也说明冒泡排序是一种严格的稳定排序算法,它不改变序列中相同元素之间的相对位置关系。
选择排序
选择排序算法的基本思路是为每一个位置选择当前最小的元素。选择排序的基本思想是,基于直接选择排序和堆排序这两种基本的简单排序方法。首先从第1个位置开始对全部元素进行选择,选出全部元素中最小的给该位置,再对第2个位置进行选择,在剩余元素中选择最小的给该位置即可;以此类推,重复进行“最小元素”的选择,直至完成第(n-1)个位置的元素选择,则第n个位置就只剩唯一的最大元素,此时不需再进行选择。使用这种排序时,要注意其中一个不同于冒泡法的细节。举例说明:序列58539.我们知道第一遍选择第1个元素“5”会和元素“3”交换,那么原序列中的两个相同元素“5”之间的前后相对顺序就发生了改变。因此,我们说选择排序不是稳定的排序算法,它在计算过程中会破坏稳定性。
快速排序
快速排序的基本思想是:通过一趟排序算法把所需要排序的序列的元素分割成两大块,其中,一部分的元素都要小于或等于另外一部分的序列元素,然后仍根据该种方法对划分后的这两块序列的元素分别再次实行快速排序算法,排序实现的整个过程可以是递归的来进行调用,最终能够实现将所需排序的无序序列元素变为一个有序的序列。
归并排序
归并排序算法就是把序列递归划分成为一个个短序列,以其中只有1个元素的直接序列或者只有2个元素的序列作为短序列的递归出口,再将全部有序的短序列按照一定的规则进行排序为长序列。归并排序融合了分治策略,即将含有n个记录的初始序列中的每个记录均视为长度为1的子序列,再将这n个子序列两两合并得到n/2个长度为2(当凡为奇数时会出现长度为l的情况)的有序子序列;将上述步骤重复操作,直至得到1个长度为n的有序长序列。需要注意的是,在进行元素比较和交换时,若两个元素大小相等则不必刻意交换位置,因此该算法不会破坏序列的稳定性,即归并排序也是稳定的排序算法。
Ⅳ 排列组合公式算法是什么
排列组合是组合学最基本的概念公式,从n个中取m个排一下,有n(n-1)(n-2)…(n-m+1)种,即n/(n-m)。排列组合计算公式从n个不同元素中取出m(m≤n)个元素的所有排列的个数。
从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。
根据组合学研究与发展的现状,它可以分为如下五个分支:经典组合学、组合设计、组合序、图与超图和组合多面形与最优化。
由于组合学所涉及的范围触及到几乎所有数学分支,也许和数学本身一样不大可能建立一种统一的理论。然而,如何在上述的五个分支的基础上建立一些统一的理论,或者从组合学中独立出来形成数学的一些新分支将是对21世纪数学家们提出的一个新的挑战。
Ⅵ 排列组合 算法实现
这是我刚刚写的,我写程序是用Turbo C 写的,本人讨厌那些华而不实的国产编辑器,VC用起来麻烦。所以没有中文注释,也汪喜欢用中文注释。抱歉!
#include "stdio.h"
#include "string.h"
#define n0 10
char letter[n0+1];
void getdata()
{
printf("please the dic's letter\n");
scanf("%s",letter);
}
void printdata()
{
int i;
printf("the dic's letter is\n");
for(i=0;i<strlen(letter);i++)
printf("%c",letter[i]);
printf("\n");
}
void move(char ch[],char intoch,int i)
{
int len=strlen(ch);
int j;
for(j=len;j>i;j--)
ch[j]=ch[j-1];
ch[i]=intoch;
}
void creatdic()
{
char temp[n0+1],outch[n0+1],ch;
int i,j,number;
FILE *in,*out;
temp[0]=letter[0];
temp[1]='\0';
if((in=fopen("D:\\dic.txt","at"))==NULL)
{ printf("infile error!");
exit(0);
}
else
fprintf(in,"%s\n",temp);
if((out=fopen("D:\\dic.txt","rt"))==NULL)
{ printf("outfile error!");
exit(0);
}
else
{
for(i=1;i<=strlen(letter);i++)
{
ch=letter[i];
rewind(out);
while(out)
{ fscanf(out,"%s\n",temp);
number=strlen(temp);
for(j=0;j<number;j++)
outch[j]=temp[j];
outch[j]='\0';
for(j=0;j<=number;j++)
{
move(outch,ch,j);
fprintf(in,"%s\n",outch);
}
}
}
}
}
void main()
{
getdata();
printdata();
creatdic();
getch();
}
程序是从N个字符中得到所有的排列,
比如:123
那就可以得到:
1
2
21
12
3
31
13
32
23
321
231
213
312
132
123
Ⅶ 在各类算法中那种算法排序是最快的
说句实话,没有最快这一说。
如果不在乎浪费空间,应该是桶排序最快
如果整体基本有序,插入排序最快
如果考虑综合情况,快速排序更加实用常见(希尔排序、堆排序等各种排序也各有优劣)
一般情况下,冒泡这种排序仅仅是名字起的有趣罢了,不太好用
Ⅷ 算法问题,排列组合,高手进
不需要用数组的,直接用3个变量就可以,很简单的!
#include<stdio.h>
void main()
{
int i,j,k;
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
for(k=1;k<=3;k++)
{
printf("%d %d %d\n",i,j,k);
}
}