57 lines
1.0 KiB
Go
57 lines
1.0 KiB
Go
/*
|
||
* @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
|
||
}
|