【转】JAVA实现排列组合算法

在网上看到的,下保存先来,有时间再看~

 

public   class  testsort {
  String[] list;
  StringBuffer sb;
  
int len,start;
  testsort(String 
in){
    len 
= Integer.parseInt(in);
    list 
= new String[len];
    
for(int i=0;i       list[i] = String.valueOf(i+1);
    printList();
  }

  
void replaceStr(int c1,int c2){
    String temp 
= list[c1];
    list[c1] 
= list[c2];
    list[c2] 
= temp;
  }

  
void printList(){
    
if(start==len-1){
      sb 
= new StringBuffer();
      
for(int i=0;i         sb.append(list[i]);
      sb.append(
" ");
      System.
out.print(sb);
    }
else{
      
for(int i=start;i         replaceStr(start++,i);
        
        printList();
        replaceStr(i,
--start);
       
// System.out.println(--start);
       
// System.out.println(start);
      }

    }

  }

  
public   static   void  main(String args[]) {
    
new testsort(args[0]);
  }

}

 

//**************************

下面我收集的关于排列的一些算法。有些我也具体不懂。以前没有好好学数据结构。先收集起来。慢慢研究也希望有高人来咱讲讲。

1.n个数的全排列
#i nclude <stdio.h>
const int N = 5;
int a[N] = {1,2,3,4,5};
void swap(int &a,int &b)
{
  int t ;
  t = a;
  a = b;
  b = t;
}
void permutation(int m,int n)
{
  int i;
  if(m==n)
  {
     for(i = 0;i<=n;i++)
     {
       printf("%d ",a[i]);
     }
     printf("/n");
  }
  for(i = m;i<=n;i++)
  {
    swap(a[i],a[m]);
    permutation(m+1,n);
    swap(a[i],a[m]);
  }
}
int main()
{
  permutation(0,4);
}


2.n取r的排列
#i nclude <stdio.h>
const int N = 5;
int a[N] = {1,2,3,4,5};
int b[N];
int r = 3;
char used[N];
void perm(int pos)
{
  int i;
  if(pos==r)
  {
    for(i = 0;i<r;i++)
     {
       printf("%d ",b[i]);
     }
    printf("/n");
  }
  for(i = 0;i<N;i++)
  {
     if(!used[i])
     {
        b[pos] = a[i];
        used[i]++;
        perm(pos+1);
        used[i]--;
     }
    
  }      
}
int main()
{
  perm(0);
}
3.n取r的组合
#i nclude <stdio.h>
const int N = 9;
int a[N] = {1,2,3,4,5,6,7,8,9};
int b[N];
int r = 4;
char used[N];
int count;
void combine(int pos)
{
  int i;
  if(pos==r)
  {
     for(i = 0;i<r;i++)
     {
       printf("%d ",a[b[i]]);
     }
    printf("/n");
    count++;
    return;
  }
  //这里是关键,第i个位置上的数,只能是从排在第i位的数开始的N-r个中的一个,后面的数一定要比前面的大
  for(i = (pos>0?(b[pos-1]+1):pos);i<=pos+N-r;i++)  
  {
    if(!used[i])
    {
      b[pos] = i;
      used[i]++;
      combine(pos+1);
      used[i]--;
    }
  }
}
int main()
{
combine(0);
}

关键字: 排列组合算法 
引用地址: http://www.dlog.cn/html/trackback.do?id=9597&type=1 (复制地址)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值