题目描述:已知序列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