next_permutation / prev_permutation
设现有序列为a[1 ... n]。
(1)在a[1 ... n]找到所有满足a[p] < a[p+1]的p的最大值。如果不存在这样的p,说明现有序列已经是最大字典序的排列。
| a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] |
| 7 | 3 | 4 | 2 | 0 | 1 | 5 | 8 | 6 |
例如上表中有a[1] < a[2],a[4] < a[5],a[5] < a[6],a[6] < a[7]这四对关系。
其中满足要求的p的最大值为6。
(2)在a[p+1 ... n]中找到所有满足a[q] > a[p]的a[q]的最小值。
| a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] |
| 7 | 3 | 4 | 2 | 0 | 1 | 5 | 8 | 6 |
例如上表中当p = 6时,a[p] = 5:
q = 7,a[q] = 8 > a[p]
q = 8,a[q] = 6 > a[p]
最小的a[q]为6,此时q = 8。
(3)交换a[p]和a[q],并反转a[p+1 ... n]中的元素。
以上表为例:
| a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] |
| 7 | 3 | 4 | 2 | 0 | 1 | 5 | 8 | 6 |
交换a[p]和a[q]后变为:
| a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] |
| 7 | 3 | 4 | 2 | 0 | 1 | 6 | 8 | 5 |
反转a[p+1 ... n]的元素后变为:
| a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] |
| 7 | 3 | 4 | 2 | 0 | 1 | 6 | 5 | 8 |
(4)关于prev_permutation的实现:
| a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] |
| 8 | 4 | 0 | 1 | 2 | 3 | 5 | 6 | 7 |
(4.1)在a[1 ... n]找到所有满足a[p] > a[p+1]的p的最大值。如果不存在这样的p,说明现有序列已经是最小字典序的排列。(在上表中p = 1)
(4.2)在a[p+1 ... n]中找到所有满足a[q] < a[p]的a[q]的最大值。(在上表中q = 5,a[q] = 3)
(4.3)交换a[p]和a[q],并反转a[p+1 ... n]中的元素。
交换前:
| a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] |
| 8 | 4 | 0 | 1 | 2 | 3 | 5 | 6 | 7 |
交换后:
| a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] |
| 8 | 3 | 0 | 1 | 2 | 4 | 5 | 6 | 7 |
反转后:
| a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] |
| 8 | 3 | 7 | 6 | 5 | 4 | 2 | 1 | 0 |

浙公网安备 33010602011771号