【面试经典】寻找全排列的下一个数(字典序算法)

    xiaoxiao2023-11-01  145

    代码展示:

    //字典树算法 #include<iostream> // #include<cmath> // #include<algorithm> using namespace std; void swap1(int arr[] ,int a,int b){ int temp=arr[a]; arr[a]=arr[b]; arr[b]=temp; return; } void Sort(int list[], int a, int n) { int temp = 0; for (int i = 1; i < n-a; ++i) for (int j = a+1; j < n-1; ++j) if (list[j] > list[j+1]) { temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; } return; } void AllRange(int arr[],int n){ int num=1;//计算排列次数 int a,b; for(int i=1;i<=n;i++){ num*=i; } while(num--){ for(int i=0;i<n;i++){ cout<<arr[i]<<" "; } cout<<endl; //从右往左找出第一个小于右边的数 for(int i=n-1;i>0;i--){ if(arr[i-1]<arr[i]){ a=i-1; break; } } //从右往左找出第一个大于arr[a]的数 for(int i=n-1;i>a;i--){ if(arr[i]>arr[a]){ b=i; break; } } //把两个数进行交换 swap1(arr,a,b); //将交换的交界处后面的数进行从小到大排列 Sort(arr,a,n); } return ; } int main(int argc, char const *argv[]) { int arr[]={1,2,3,4,5,6,7,8,9}; AllRange(arr,5); return 0; }

     结果展示:

    最新回复(0)