字典排序之全排列

2021-08-29 01:15:33 字數 956 閱讀 9492

簡介:計算所給元素的所有全排列組合有多重方法,此篇文章說明字典排序方法求解全排列。何為字典排序?指的是元素按照0-9,a-z的順序排列,這樣使得與計算的全排列結果與上乙個結果具有最長的字首。

演算法原理:p = ,元素集合

1、在p中從右向左遍歷,直至查到

2、在p中從右向左遍歷,找到第乙個比

3、交換

4、將i以後的值翻轉,得到新的序列

5、重複第一步,直至所有的元素都已經是倒序排列

**實現:

public static list> permute(int nums) 

result.add(new arraylist<>(tempresult));

while (true)

}// index右側大於index位置值的最小位置

int lastindex = 0;

boolean isfind = false;

for (int i = tempresult.size() - 1; i > index; i--)

}if (!isfind)

// 交換index和lastindex的值

int temp = tempresult.get(index);

tempresult.set(index, tempresult.get(lastindex));

tempresult.set(lastindex, temp);

// 將index後的元素翻轉

int len = tempresult.size() - index - 1;

for (int k = 1, l = tempresult.size() - 1; k <= len / 2; k++)

result.add(new arraylist<>(tempresult));

}return result;

}

全排列之字典序法

1 對於輸入的字典序排列,反向查詢第一對滿足a j 2 仍舊反向查詢第乙個下標k,使得 a j 3 交換a j 和a k 4 翻轉a j 1 a end 此法能適應有重複元素的系列 如下 include include using namespace std int cmp const void a...

全排列 字典序排列

include includeusing namespace std define dig num 4 void cal int str int first int last cout endl if first last bool get f l int list int former int l...

字典序全排列

思路 從左向右找到不符合遞增規律的第乙個數,比如1,2,5,4,3中的這個數就是2,將其與其右面遞增序列中的比他大的最小數,比如在前面例子中的3互換,得到1,3,5,4,2,最後,將該數右邊的遞增序列排序,得到1,3,2,4,5即可。上面這個是求某乙個數的下乙個排列,而全排列只需按這個思路,將初始陣...