回复 13楼 beyondyf
如果有重复数, 该如何去重呢
排列不考虑重复数。提交给函数的数据要在提交前自行判断,函数也不应该负责去重的工作。
实际应用中如果有这样的数据校验要求,我建议单独写校验模块。这样可以提高效率(免得每次调用一个功能都校验数据)。
#include<stdio.h> void next_permutation(int * s, int len) { int i, j, k, t; for(i = len - 1; i && s[i] <= s[i - 1]; i--); for(j = i, k = len - 1; j < k; j++, k--){ t = s[j]; s[j] = s[k]; s[k] = t;} if(!i) return; for(j = i--, k = len - 1; j < k; s[t] > s[i] ? k = t : (j = t + 1)) t = (j + k) >> 1; t = s[i]; s[i] = s[k]; s[k] = t; } int main() { int s[5] = {1, 1, 2, 2, 3}, len = 5, i, j; for(i = 1; i <= 40; i++, puts("")) { printf("%2d : ", i); for(j = 0; j < len; printf(" %d", s[j++])); next_permutation(s, len); } return 0; }下面是以上代码的执行结果
1 : 1 1 2 2 3 2 : 1 1 2 3 2 3 : 1 1 3 2 2 4 : 1 2 1 2 3 5 : 1 2 1 3 2 6 : 1 2 2 1 3 7 : 1 2 2 3 1 8 : 1 2 3 1 2 9 : 1 2 3 2 1 10 : 1 3 1 2 2 11 : 1 3 2 1 2 12 : 1 3 2 2 1 13 : 2 1 1 2 3 14 : 2 1 1 3 2 15 : 2 1 2 1 3 16 : 2 1 2 3 1 17 : 2 1 3 1 2 18 : 2 1 3 2 1 19 : 2 2 1 1 3 20 : 2 2 1 3 1 21 : 2 2 3 1 1 22 : 2 3 1 1 2 23 : 2 3 1 2 1 24 : 2 3 2 1 1 25 : 3 1 1 2 2 26 : 3 1 2 1 2 27 : 3 1 2 2 1 28 : 3 2 1 1 2 29 : 3 2 1 2 1 30 : 3 2 2 1 1 31 : 1 1 2 2 3 32 : 1 1 2 3 2 33 : 1 1 3 2 2 34 : 1 2 1 2 3 35 : 1 2 1 3 2 36 : 1 2 2 1 3 37 : 1 2 2 3 1 38 : 1 2 3 1 2 39 : 1 2 3 2 1 40 : 1 3 1 2 2