feat(Go-Tool):2021/03/26: 新增全排列的递归实现、字典序实现、递增进制位实现、递减进制位实现
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* @Author : huangzj
|
||||
* @Time : 2021/3/22 15:29
|
||||
* @Description:
|
||||
*/
|
||||
|
||||
package FullPermutation
|
||||
|
||||
import (
|
||||
sort2 "Go-Tool/util/sort"
|
||||
)
|
||||
|
||||
//字典序获取全排列
|
||||
func (per *Permutation) DictionaryOrder(b []byte) {
|
||||
//先排序
|
||||
sort2.QuickSortByte(b, 0, len(b)-1)
|
||||
for {
|
||||
bef := 0
|
||||
afr := 0
|
||||
result := make([]byte, len(b))
|
||||
copy(result, b)
|
||||
per.bytes = append(per.bytes, result)
|
||||
|
||||
//从右往左找到第一个左边比右边小的数字
|
||||
for bef = len(b) - 2; ; bef-- {
|
||||
if bef < 0 {
|
||||
return
|
||||
}
|
||||
if b[bef] < b[bef+1] {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
//知道q的位置之后
|
||||
//从q开始向右边查找比位置q的数字大的第一个数字的位置
|
||||
for afr = len(b) - 1; afr > 0; afr-- {
|
||||
if b[afr] > b[bef] {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
//交换两个数字
|
||||
b[bef], b[afr] = b[afr], b[bef]
|
||||
//把后面的数字进行转置成递增顺序
|
||||
b = per.Reverse(b, bef+1, len(b)-1)
|
||||
}
|
||||
}
|
||||
|
||||
func (per *Permutation) Reverse(b []byte, start, end int) []byte {
|
||||
for start <= end {
|
||||
b[start], b[end] = b[end], b[start]
|
||||
start++
|
||||
end--
|
||||
}
|
||||
return b
|
||||
}
|
||||
Reference in New Issue
Block a user