您的位置:首页 > 其它

算法基础---全排列算法

2015-06-29 14:43 246 查看
(一)递归的全排列算法

(A、B、C、D)的全排列为

1、A后面跟(B、C、D)的全排列

2、B后面跟(A、C、D)的全排列

3、C后面跟(A、B、D)的全排列

4、D后面跟(A、B、C)的全排列

而对1中的(B、C、D)照样可以按照上面的形式进行分解。

/**
 * 
 */
package test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * @author MohnSnow
 * @time 2015年6月29日 下午2:21:40
 * 
 */
public class permutation {

<span style="white-space:pre">	</span>/**
<span style="white-space:pre">	</span> * @param nummengdx
<span style="white-space:pre">	</span> *            -fnst
<span style="white-space:pre">	</span> */
<span style="white-space:pre">	</span>//LeetCode31---http://blog.csdn.net/bingbing8219/article/details/46504475
<span style="white-space:pre">	</span>//数学方法去做题----374msAC
<span style="white-space:pre">	</span>private static void nextPermutation(int[] nums) {
<span style="white-space:pre">		</span>int len = nums.length;
<span style="white-space:pre">		</span>int i = len - 1;
<span style="white-space:pre">		</span>while (i > 0) {
<span style="white-space:pre">			</span>if (nums[i] <= nums[i - 1]) {
<span style="white-space:pre">				</span>i--;
<span style="white-space:pre">			</span>} else {
<span style="white-space:pre">				</span>break;
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>if (i == 0) {
<span style="white-space:pre">			</span>Arrays.sort(nums);
<span style="white-space:pre">		</span>} else {
<span style="white-space:pre">			</span>int j = len - 1;
<span style="white-space:pre">			</span>while (j > i - 1) {
<span style="white-space:pre">				</span>if (nums[j] > nums[i - 1]) {
<span style="white-space:pre">					</span>int temp = nums[j];
<span style="white-space:pre">					</span>nums[j] = nums[i - 1];
<span style="white-space:pre">					</span>nums[i - 1] = temp;
<span style="white-space:pre">					</span>Arrays.sort(nums, i, len);
<span style="white-space:pre">					</span>break;
<span style="white-space:pre">				</span>} else {
<span style="white-space:pre">					</span>j--;
<span style="white-space:pre">				</span>}
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>System.out.println(Arrays.toString(nums));
<span style="white-space:pre">	</span>}

<span style="white-space:pre">	</span>//LeetCode46---http://blog.csdn.net/bingbing8219/article/details/46619591
<span style="white-space:pre">	</span>//递归算法,求出所有排列组合,未按顺序排序
<span style="white-space:pre">	</span>public static void permutationSum(int[] num, int begin, int end) {
<span style="white-space:pre">		</span>if (begin == end) {
<span style="white-space:pre">			</span>for (int i = 0; i < num.length; i++) {
<span style="white-space:pre">				</span>System.out.print(num[i] + "");
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>System.out.println("");
<span style="white-space:pre">			</span>return;
<span style="white-space:pre">		</span>} else {
<span style="white-space:pre">			</span>for (int i = begin; i <= end; i++) {
<span style="white-space:pre">				</span>swap(num, i, begin);
<span style="white-space:pre">				</span>permutationSum(num, begin + 1, end);
<span style="white-space:pre">				</span>swap(num, i, begin);
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}

<span style="white-space:pre">	</span>public static void swap(int[] num, int i, int begin) {
<span style="white-space:pre">		</span>int temp = num[i];
<span style="white-space:pre">		</span>num[i] = num[begin];
<span style="white-space:pre">		</span>num[begin] = temp;
<span style="white-space:pre">	</span>}

<span style="white-space:pre">	</span>//非递归算法,求出所有排列组合
<span style="white-space:pre">	</span>public static LinkedList<List<Integer>> permutationSum1(int[] nums) {
<span style="white-space:pre">		</span>LinkedList<List<Integer>> res = new LinkedList<List<Integer>>();
<span style="white-space:pre">		</span>res.add(new ArrayList<Integer>());
<span style="white-space:pre">		</span>for (int n : nums) {
<span style="white-space:pre">			</span>int size = res.size();
<span style="white-space:pre">			</span>for (; size > 0; size--) {
<span style="white-space:pre">				</span>List<Integer> r = res.pollFirst();
<span style="white-space:pre">				</span>for (int i = 0; i <= r.size(); i++) {
<span style="white-space:pre">					</span>List<Integer> t = new ArrayList<Integer>(r);
<span style="white-space:pre">					</span>t.add(i, n);
<span style="white-space:pre">					</span>res.add(t);
<span style="white-space:pre">				</span>}
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>return res;
<span style="white-space:pre">	</span>}

<span style="white-space:pre">	</span>//LeetCode47---http://blog.csdn.net/bingbing8219/article/details/46621359
<span style="white-space:pre">	</span>//递归算法,求出所有排列组合,去除重复排序
<span style="white-space:pre">	</span>public static void permutationSum2(int[] num, int begin) {
<span style="white-space:pre">		</span>if (begin == num.length - 1) {
<span style="white-space:pre">			</span>for (int i = 0; i < num.length; i++) {
<span style="white-space:pre">				</span>System.out.print(num[i] + "");
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>System.out.println("");
<span style="white-space:pre">			</span>return;
<span style="white-space:pre">		</span>} else {
<span style="white-space:pre">			</span>for (int i = begin; i <= num.length - 1; i++) {
<span style="white-space:pre">				</span>if (i > begin && num[i] == num[i - 1]) {
<span style="white-space:pre">					</span>continue;
<span style="white-space:pre">				</span>}
<span style="white-space:pre">				</span>swap(num, i, begin);
<span style="white-space:pre">				</span>permutationSum2(num, begin + 1);
<span style="white-space:pre">				</span>swap(num, i, begin);
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}

<span style="white-space:pre">	</span>public static void main(String[] args) {
<span style="white-space:pre">		</span>int[] num = { 1, 2, 2 };
<span style="white-space:pre">		</span>System.out.println("--------下一个排序序列是:nextPermutation()------");
<span style="white-space:pre">		</span>nextPermutation(num);
<span style="white-space:pre">		</span>System.out.println("--------递归列出所有序列是:permutationSum()------");
<span style="white-space:pre">		</span>permutationSum(num, 0, num.length - 1);
<span style="white-space:pre">		</span>System.out.println("--------递归列出所有序列是:permutationSum2()(去重)------");
<span style="white-space:pre">		</span>System.out.println("--------去重前需要先排序一下------");
<span style="white-space:pre">		</span>Arrays.sort(num);
<span style="white-space:pre">		</span>permutationSum2(num, 0);
<span style="white-space:pre">		</span>System.out.println("--------非递归列出所有序列是:permutationSum1()------");
<span style="white-space:pre">		</span>System.out.println("permutationSum1: " + permutationSum1(num).toString());
<span style="white-space:pre">	</span>}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法