字典序全排列思想及C++实现

(二)非递归全排列算法,即按字典序排列算法。
基本思想是:
1.对初始队列进行排序,找到所有排列中最小的一个排列Pmin。
2.找到刚刚好比Pmin大比其它都小的排列P(min+1)。
3.循环执行第二步,直到找到一个最大的排列,算法结束。
如排列ABCDE,这是所有排列中最小的一个排列,刚好比ABCDE大的排列是:ABCED。
算法如下:
给定已知序列P = A1A2A3.....An
对P按字典排序,得到P的一个最小排列Pmin = A1A2A3....An ,满足Ai > A(i-1) (1 < i <= n)
从Pmin开始,找到刚好比Pmin大的一个排列P(min+1),再找到刚好比P(min+1)大的一个排列,如此重复。
1.从后向前(即从An->A1),找到第一对为升序的相邻元素,即Ai < A(i+1)。
若找不到这样的Ai,说明已经找到最后一个全排列,可以返回了。
2.从后向前,找到第一个比Ai大的数Aj,交换Ai和Aj。
3.将排列中A(i+1)A(i+2)....An这个序列的数逆序倒置,即An.....A(i+2)A(i+1)。因为由前面第1、2可以得知,A(i+1)>=A(i+2)>=.....>=An,这为一个升序序列,应将该序列逆序倒置,所得到的新排列才刚刚好比上个排列大。
4.重复步骤1-3,直到返回。

#include
using namespace std;
#define N 4
int arr[24][N]={{1,2,3,4}};
void overturn(int arr[][N],int begin,int end);
void findandchage(int arr[][N],int row);
void swap(int arr[][N],int i,int j,int row);
int main()
{
cout<<"begin"<for(int time=1;time!=24;time++){
for(int line=0;line!=N;line++){
arr[time][line]=arr[time-1][line];
}
findandchage(arr,time);
}
for(int i=0;i!=24;i++){
for(int j=0;j!=N;j++)
cout<cout<}


cout<<"end";
system("pause");
return 0;

}
void overturn(int arr[][N],int begin,int row)//翻转
{ int temp;
int end=N-1;
while(begintemp=arr[row][begin];
arr[row][begin]=arr[row][end];
arr[row][end]=temp;
begin=begin+1;
end=end-1;
}
}
void swap(int arr[][N],int i,int j,int row)
{
int temp;
temp=arr[row][i];
arr[row][i]=arr[row][j];
arr[row][j]=temp;
}
void findandchage(int arr[][N],int row)//找到不是字典序的数
{ int i,j;
int minindex;
for(i=2;i>=0;i--){
if(arr[row][i]minindex=i+1;
break;
}
}
for(j=N-1;j!=i;j--)
{
if(arr[row][i]arr[row][j]){
minindex=j;
}
}
swap(arr,i,minindex,row);
overturn(arr,i+1,row);

}

相关主题
相关文档
最新文档