prev_permutation_cycle与next_permutation_cycle

来源:互联网 发布:cstr在vb中什么意思 编辑:程序博客网 时间:2024/06/03 04:18

下一个排列与上一个排列的实现:
例如:1234的下一个排列为1243,在下一个排列为1324因此可以设置两个相邻的指针i,ii,指针从后往前搜索,直到*i <*ii,
这里为i->3; jj->4;然后设置指针j从最后往前搜索,找到第一个大于i的,即*i<*j;这里j->4;交换i与j的元素,然后将ii到最后逆序。
上一个排列的思路为 *i>*ii , *i > *j ,交换i与j,ii后逆序

void next_permutation_cycle(int* arr, int n){    if (n < 2){ return; }    int right = n - 2, left = n - 1;//right与left写反了。。。。。。    while (1){        if (arr[right] < arr[left]){            int big_right = n - 1;            while (!(arr[big_right] > arr[right])){ --big_right; }            swap(arr[big_right], arr[right]);            reverse(&arr[left], &arr[n]);            break;        }        if (right == 0){ reverse(&arr[0], &arr[n]); break;}        --right; --left;    }}void prev_permutation_cycle(int* arr, int n){    if (n < 2){ return; }    int left = n - 2;    int right = n - 1;    while (1){        if (arr[left] > arr[right]){            int j = n - 1;            while (!(arr[left]>arr[j])){ --j; }            swap(arr[left], arr[j]);            reverse(&arr[right], &arr[n]);            break;        }        if (left == 0){ reverse(&arr[0], &arr[n]); break; }        --left; --right;    }}
原创粉丝点击