下一个排列实现

来源:互联网 发布:php前台模板 编辑:程序博客网 时间:2024/05/01 14:28
#include <iostream>using namespace std;//交换数组里面的两个元素void swap(int array[], int i, int j) {int tmp = array[i];array[i] = array[j];array[j] = tmp;}//反转数组区间void reverse(int array[], int first, int last) //左闭右开区间,与STL保持一致,[first, last){ last--;while (first < last)swap(array, first++, last--);}/*** @brief 返回下一个排列,例如当前排列是12345,下一个是12354* @param[inout] num 当前排列,例如12345* @param[in] first 开始位置* @param[in] last 结束位置,左闭右开区间* @return 成功返回0,失败返回-1*/int next_permutation(int num[], int first, int last) {int i, j;i = last - 2; while (i >= 0 && num[i] >= num[i + 1])//步骤1:从右往左找,找到第一个违反升序的数字(记作:划分数字),用i保存位置i--;if (i == -1) //没找到,说明整个序列是降序的{reverse(num, first, last);//回到第一个位置,即升序return -1;}j = last - 1; while (num[j] <= num[i])//步骤2:从右往左找,找到第一个大于划分数字的数字,记作改变数字,用j保存位置--j;swap(num, i, j);//步骤3:交换划分数字和改变数字的位置reverse(num, i + 1, last);//步骤4:把划分数字位置右边的所有数字逆序return 0;}void printArray(int array[], int len){for (int i = 0; i < len; i++){cout << array[i] << " " ;}cout << endl;}int main(){int a[] = {1,2,3,4};printf("original permutation:\t");printArray(a, 4);next_permutation(a, 0, 4);printf("next permutation:\t");printArray(a, 4);return 0;}


0 0
原创粉丝点击