#include<cstdio> voidmy_swap(int* arr, int a, int b) { int tmp = arr[a]; arr[a] = arr[b]; arr[b] = tmp; } voidpermutation(int* arr, int curser, int end) { if (curser == end) {//递归出口,输出排列数 for (int i = 0; i <= end; i++)printf("%d", arr[i]); printf("\n"); return; } /* 先固定下标为curser的数,然后求剩下数的全排列 curser可依次取arr[curser...end]中的值 */ for (int i = curser; i <= end; i++) { my_swap(arr, i, curser);//把第i位固定在首位curser中,即与arr[curser]交换 permutation(arr, curser + 1, end);//把交换后剩下的数进行递归全排列 my_swap(arr, i, curser); //避免下轮循环时,arr[curser...end]中的值发生改变 }
#include<cstdio> voidmy_swap(int* arr, int a, int b) { int tmp = arr[a]; arr[a] = arr[b]; arr[b] = tmp; } //输出当前arr的下一个全排列 boolnext_permu(int* arr, int size) { for (int i = size - 2; i >= 0; i--) { if (arr[i] < arr[i + 1]) { int j; //此时i-1后的数组已是降序,故从后往前 for (j = size - 1; j > i && arr[j] <= arr[i]; j--); my_swap(arr, i, j); //最大字典序时,i=j,故不需要额外判断for循环退出的条件 for (int low = i+1, high = size - 1; low < high; low++, high--) my_swap(arr, low, high); returntrue; } } returnfalse; }
intmain() { int arr[] = { 1,2,2,2 ,4 }; int size = 4; //先输出123,最初的排列 for (int i = 0; i < size; i++)printf("%d", arr[i]); printf("\n"); while (next_permu(arr, size)) { for (int i = 0; i < size; i++)printf("%d", arr[i]); printf("\n"); } return0; }