很烦,字典排序我已经总结过一次了,然后不知道哪里去了。。。
初始排列顺序:P = P1,P2,...,Pn。
条件一:找到最大的一个P[j-1]<P[j]的j值,标注为x
条件二:找到最大的一个a[j-1]<a[i]的i值,标注为y
条件三:交换P[x-1]与P[y]
条件四:将x-1后面的元素从小到大排列
这样就完成了字典排序,当然,如果要求的知识数组的下一个字典排序,只需要把while条件删除。
#include <iostream>
#include <algorithm>
using namespace std;
int a[101];
int b[101];
int main() {
for(int i=1;i<=100;i++)
a[i]=i; //就是一个数组,在需要的时候,可以自己输入,我是为了方便
int n;
cin>>n;
for(int i=1;i<=n;i++) { //找到a的最大倒序排列顺序
b[i]=a[n+1-i];
//cout<<b[i];
}
int x=0,y=0;
int num=0;
while(1) {
//x=0,y=0;
for(int j=n;j>1;j--) {
if(a[j]>a[j-1]) { //限制条件,找到最大的一个a[j-1]<a[j]的j值
x=j;
break;
}
}
for(int i=n;i>=x-1;i--)
if(a[i]>a[x-1]) { //限制条件,找到最大的一个a[j-1]<a[i]的i值
y=i;
break;
}
swap(a[x-1],a[y]);
sort(a+x,a+n+1);
for(int i=1;i<=n;i++)
cout<<a[i]; //输出a的下一种字典排序
cout<<endl;
for(int i=1;i<=n;i++) {
if(a[i]==b[i]) {
num++; //用num记录a与b中有几个位置一样的元素
continue;
}
num=0;
}
if(num==n) //当a与b完全一样时,跳出while循环
break;
}
return 0;
}