寻找全排列

题目描述:已知序列A=[a1,a2,…,an],求该序列的全排列。
解题思路:实质是找下一个序列,然后令当前序列等于下一个序列,如此反复,知道没有下一个序列为止。令i指向序列末尾,j=i-1。
(1)如果aj>ai,j–, i–。如果aj小于ai,不能直接交换,比如1、2、3、5、4这个序列,3<5,不能直接交换,还得跟5后边的元素比,这时固定j,令i=n-1,aj和ai再比。如果aj小于ai,这时可以交换,并将元素aj+1,…,an进行部分升序排列,即为结果,否则i–;
(2)如果i<=0,当前i结束,结束。
循环过程(1)(2),即可求出结果。下面分别用C++、Java、Python语言实现该算法。

C++代码:

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
//寻找下一个排列
bool next_pailie(vector<int> &input){
    int i=input.size()-1;
    int j=i-1;
    while(i>0){
        if(input[j]<input[i]){//找到要交换的j
            i=input.size()-1;
            while(i>0){
                if(input[j]<input[i]){//找到交换的i
                    iter_swap(input.begin()+j,input.begin()+i);
                    sort(input.begin()+j+1,input.end());
                    return true;
                }
                i--;
            }
        }
        i--;
        j--;
    }
    return false;
}
int main(){
    int b[]={4,1,3,2,5};
    vector<int> test(b,b+5);
    vector< vector<int> > all_pailie;
   do{
       all_pailie.push_back(test);
   }
   while(next_pailie(test));
   return 0;
}

Java代码:

package hehehe.utils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @author lirunshun
 *
 */
public class test{
    //寻找下一个排列
    public static boolean next_pailie(List<Integer> input){
        int i=input.size()-1;
        int j=i-1;
        while(i>0){
            if(input.get(j)<input.get(i)){//找到j
                i=input.size()-1;
                while(i>0){
                    if(input.get(j)<input.get(i)){//找到i
                        Collections.swap(input, i, j);
                        List<Integer> tmp=input.subList(j+1, input.size());//取出部分元素进行排序
                        Collections.sort(tmp);
                        for(int k=j+1; k<input.size(); k++){//排序后放回
                            input.set(k,tmp.get(k-j-1));
                        }
                        System.out.println(input);
                        return true;
                    }
                    i--;
                }
            }
            i--;
            j--;
        }
        return false;
    }
    public static void main(String[] args){
        Integer[] a={4,1,3,2,5};
        List<Integer> input=Arrays.asList(a);
        List<String> result=new ArrayList<>();
        do{
            String tmp=input.toString();
            result.add(tmp);
        }while(next_pailie(input));
        System.out.println("hehe");
    }
}

Python代码:

# -*- coding:utf-8 -*-
#定义求下一排列的方法
def next_pailie(input):
    i=len(input)-1
    j=i-1
    while i>0 :
        if input[j]<input[i]:#找到j
            i=len(input)-1
            while i>0:
                if input[j]<input[i]:#找到i
                    input[i],input[j]=input[j],input[i]#交换元素
                    input[j+1:]=sorted(input[j+1:])#排序
                    return True
                i-=1
        i-=1
        j-=1
    return False
#测试方法
input = [4, 1, 3, 2, 5]
result = []#存放结果的列表
result.append(tuple(input))
while next_pailie(input):
    result.append(tuple(input))
print result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值