全排列 字典序排列

2021-06-18 08:30:15 字數 1767 閱讀 5684

#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,我們從後往前尋...