学会了(喜
2024-07-23 22:08:45
发布于:湖南
32阅读
0回复
0点赞
以4 2 5 3 1
为例:
1.从后往前,找到第一个前面的数小于后面的数.这里是2
.
2.从后往前,找到第一个比当前数大的数.这个数是3
.
3.交换这两个数.
4.在3
后面的数用升序排列(由于后面的数已是降序,可以使用反转节省时间).
进行完操作后的数列为4 3 1 2 5
.
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[100005];
int n;
bool next_permunation(){
int i;
for(i = n; i > 1; i--){//第一步,找数
if(a[i] > a[i - 1]) break;
}
if(i == 1) return 0;//没找到就说明全排列结束了
for(int j = n; j >= i; j--){//第二步,可以二分优化,但没必要
if(a[j] > a[i - 1]){
swap(a[j], a[i - 1]);//第三步,交换
reverse(a + i, a + n + 1);//第四步,反转
return 1;
}
}
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++){
a[i] = i;
printf("%5d", a[i]);
}
cout << endl;
while(next_permunation()){
for(int i = 1; i <= n; i++){
printf("%5d", a[i]);
}
cout << endl;
}
return 0;
}
全部评论 1
顶
2024-07-23 来自 湖南
0
有帮助,赞一个