关闭

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

2506人阅读 评论(0) 收藏 举报

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

 

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:265302次
    • 积分:3134
    • 等级:
    • 排名:第11380名
    • 原创:27篇
    • 转载:114篇
    • 译文:0篇
    • 评论:29条
    文章分类
    最新评论
    比较好的技术博客