我实际上曾经为此手动编写过一个算法。这里是:
bool incr(int z[NUM_INDICES]){
int a=NUM_INDICES-1;
for(int i=NUM_INDICES-2;i>=0;i--)
if(z[i]>z[i+1]) a--;
else break;
if(a==0) return false;
int b=2147483647,c;
for(int i=a;i<=NUM_INDICES-1;i++)
if(z[i]>z[a-1]&&z[i]-z[a-1]<b){
b=z[i]-z[a-1];
c=i;
}
int temp=z[a-1]; z[a-1]=z[c]; z[c]=temp;
qsort(z+a,NUM_INDICES-a,sizeof(int),comp);
return true;
}
这是增量函数(即,您有一个类似 [3,2,4,1] 的数组,将其传递给 this,然后它会将其修改为 [3,4,1,2])。它解决了这样一个事实,即如果数组的最后一个 d 元素按降序排列,那么下一个数组(按“字母”顺序)应该满足以下条件:1)最后一个 d+1 个元素之间是一个排列; 2) 倒数第 d+1 个元素是最后一个 d+1 个元素中的下一个最高元素; 3) 最后的 d 元素应该按升序排列。当你有类似 [2,5,3, 8,7,6,4,1] 的东西时,你可以直观地看到这一点: d = 5 在这种情况下; 3 变成最后 d+1 = 6 个元素的下一个最高值;而最后的d = 5按升序排列,所以变成了[2,5,4,1,3,6,7,8]。
第一个循环基本确定d。它向后循环数组,比较连续的元素,以确定最后按降序排列的元素的数量。在循环结束时,a 成为降序排列的第一个元素。如果a==0,那么整个数组是降序排列的,不能再做任何事情了。
下一个循环确定第 d+1 个倒数第二个元素应该是什么。我们指定它应该是最后一个 d+1 元素中的下一个最高元素,所以这个循环确定它是什么。 (注意 z[a-1] 是第 d+1 个倒数第二个元素。)在循环结束时,b 包含最低的 z[i]-z[a-1],即为正数;也就是说,z[i] 应该大于z[a-1],但尽可能低(这样z[a-1] 就成为下一个最高元素)。 c 包含对应元素的索引。我们丢弃了b,因为我们只需要索引。
接下来的三行交换z[a-1] 和z[c],因此第 d+1-th-to-last 元素获取行中的下一个元素,而另一个元素 (@987654333 @) 保留z[a-1]。最后,我们使用qsort 对最后的d 元素进行排序(comp 必须在别处声明;参见qsort 上的C++ 文档)。