手记

全排列算法java语言的实现


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;

import java.util.List;

public class Perm {

    int n =0;//如果输入的元素个数超过8n则需要用long类型
    List<String>lists = new ArrayList<>();

    /**
     * 读取文件内待排列的数据
     * @return
     * @throws IOException 
     */

    public  String [] in_file_qpl(String infile) throws IOException{
        BufferedReader in =new BufferedReader( 
                new InputStreamReader(
                        new FileInputStream(infile)));
        List<String> list = new ArrayList<>();
        String line ;
        while ((line = in.readLine())!=null ) {
            list.add(line);
        }
        String[] a = list.toArray(new  String[list.size()]) ;
        System.out.println(a.length);
        in.close();
        return a;

    }
    public  void out_file_qpl(String outfile , List<String> lists) throws IOException{
        System.out.println(lists.isEmpty());
        FileOutputStream fos = new FileOutputStream(outfile);
        byte [] buf = new byte[8*1024];
        String buff= null;
        for (int i = 0; i < lists.size(); i++) {
            buff= lists.get(i);
            buf = buff.getBytes();
            fos.write(buf);
            fos.write("\r\n".getBytes());
            fos.flush();
        }

        fos.close();

    }

    /**
     * @param infile
     * @param outfile
     * @throws IOException
     * 驱动函数 传入输入与输出文件的地址
     */
    public void perm(String infile ,String outfile) throws IOException{
        String[] list = in_file_qpl(infile);
         Arrays.sort(list);
         perm(list, 0, list.length-1);
         out_file_qpl(outfile, lists);
    }

    /**
     * @param list
     * @param k
     * @param m
     * @param n
     * @return 返回储存有所有全排列的string数组
     *  list 的第 0~ k-1 个元素作为前缀、第 k~m-1 个元素进行全排列得到的全排列
     */
    public void perm(String[]  list ,int k ,int m  ){
        int i ;
        if(k>m){
            n++;
            System.out.println("第"+n +"个排列为:  " + Arrays.toString(list));
            lists.add( Arrays.toString(list));
            System.out.println();
        }else{
            for( i = k; i<=m ; i++){
                swap1(list, k   , i);
                perm(list, k+1, m);
                swap2(list, k   , i);
            }
        }

    }

    /**
     * 交换数组中a和b位置上的元素
     * @param list
     * @param a
     * @param b
     */
    public void swap( String [] list, int  a , int  b){
        String m =list[a] ;
        list[a] = list[b];
        list[b] = m;
    }
    /**
     * list中  将a与a到b-1直间得数向后顺延一个位置,b位置得元素置换a得位置上
     * @param a
     * @param b
     */
    public void swap1(String[] list, int a, int b){
        int i ;
        String  temp ;
        temp = list[b];
        for(i = b ;  i > a;  i--){
            list[i]=list[i-1];

        }
        list[a] = temp;
    }
    /**
     * list中  将a-1与a-1到b直间得数向前顺延一个位置,b位置得元素置换a得位置上
     * @param a
     * @param b
     */
    public  void swap2 (String [] list, int a, int b){
        int i ;
        String  temp ;
        temp = list[a];
        for(i = a ;  i <b;  i++){
            list[i]=list[i+1];
        }
        list[b] = temp;
    }
    public static void main(String[] args) {   
        Perm perm = new Perm();

        try {
            perm.perm("src/inperm.txt", "src/outperm.txt");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(perm.n);

    }
}
0人推荐
随时随地看视频
慕课网APP