首页 > 代码库 > 下一次最近排列
下一次最近排列
对序列 {a, b, c},每一个元素都比后面的小,按照字典序列,固定a之后,a比bc都小,c比b大,它的下一个序列即为{a, c, b},而{a, c, b}的上一个序列即为{a, b, c},同理可以推出所有的六个序列为:{a, b, c}、{a, c, b}、{b, a, c}、{b, c, a}、{c, a, b}、{c, b, a},其中{a, b, c}没有上一个元素,{c, b, a}没有下一个元素。
代码如下:
void swap(int *a, int *b){ int c = *a; *a = *b; *b = c;}void reverse(int *array, int begin, int end){ int i, j; for (i = begin, j = end; i < j; i++, j--) { swap(&array[i], &array[j]); }}int next_permutation(int *array, int begin, int end){ if (array == NULL || begin >= end) { return 0; } int i, j, k; for (j = end, i = end - 1; i >= begin && j > begin; j--, i--) { if (array[i] < array[j]) { break; } } if (j == 0 && i == -1) { return 0; } for (k = end; k >= j; k--) { if (array[k] > array[i]) { break; } } swap(&array[i], &array[k]); reverse(array, i + 1, end); return 1;}int main(void){ int array[4] = {1, 2, 3, 4}; int begin = 0, end = 3; do { int i; for (i = 0; i <= end; i++) { cout << array[i] << ", "; } cout << endl; }while (next_permutation(array, begin, end)); getchar(); return 0;}
运行结果:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。