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
posted @ 2015-04-06 15:04  meowcherry  阅读(146)  评论(0)    收藏  举报