#include#includeusing namespace std;
#define dig_num 4
void cal( int str , int first , int last )
cout << endl;
} if( first < last )
} }}bool get_f_l( int list , int &former , int &latter , int end )
}} return false;
} return false;
}void dic_sort( int list , int end )
printf( "\n" );
//首先交換這兩個位置的值
t = list[ former ];
list[ former ] = list[ latter ];
list[ latter ] = t;
//這時候former後面的元素是從大到小的,現在需要將其對調,變成從小到大排序的
i = former + 1;
j = end;
while( i < j )
} //輸出最後一種情況,即從大到小有序的
for( i = 0 ; i <= end ; i ++ )
printf( "\n" );
}void cyc_shift( int list , int depth , int list2 )
//新增新元素
if( depth < dig_num )
//下面開始迴圈移位
int step;
for( step = 0 ; step <= depth ; step ++ )
a[ depth ] = temp;
cyc_shift( list , depth + 1 , a );
} free( a );
} if( depth == dig_num )
printf( "\n" ); }}
int main()
//字典序全排列
printf( "字典序全排列:\n" );
dic_sort( list , dig_num - 1 );
//遞迴無序全排列
printf( "遞迴無序全排列:\n" );
for( i = 0 ; i < dig_num ; i ++ )
cal( list , 0 , 3 );
//迴圈移位全排列
printf( "迴圈移位全排列:\n" );
for( i = 0 ; i < dig_num ; i ++ )
cyc_shift( list , 0 , null );
free( list );
return 0;
}#includeusing namespace std;
void dfs( int list , bool flag , int *a , int depth )
for( i = 0 ; i < 4 ; i ++ )
} free( b );
} else if( depth == 4 )
cout << endl; }}
int main() ;
bool flag[ 4 ] = ;
dfs( list , flag , null , 0 );
return 1;
}
字典序全排列
思路 從左向右找到不符合遞增規律的第乙個數,比如1,2,5,4,3中的這個數就是2,將其與其右面遞增序列中的比他大的最小數,比如在前面例子中的3互換,得到1,3,5,4,2,最後,將該數右邊的遞增序列排序,得到1,3,2,4,5即可。上面這個是求某乙個數的下乙個排列,而全排列只需按這個思路,將初始陣...
字典序全排列
給出正整數n,則1 n這n個數可以構成n!種排列,把這些排列按照從小到大的順序 字典順序 列出,如n 3時,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1 這6個排列。字典序演算法如下 假設這n個數的某乙個排列為 p p1 p2 p3.pj 1 pj pj 1.pk 1 ...
全排列演算法的字典序排列
之前在中描述了全排列演算法的遞迴解法,這裡再說一種演算法 字典序排列。字典序排列就是按照字典a z,1 9的順序給出字串的順序全排列,例如abc的全排列就是從abc一直排到cba。那麼給定乙個字串,怎麼找出恰好大於該字串的下乙個排列呢?我們考慮如下的步驟 1 假設字串為p1p2 pn,我們從後往前尋...