PTA資料結構 習題2 8 輸出全排列 20分

2021-10-08 17:50:51 字數 1934 閱讀 4426

請編寫程式輸出前n個正整數的全排列(n<10),並通過9個測試用例(即n從1到9)觀察n逐步增大時程式的執行時間。

輸入給出正整數n(<10)。

輸出1到n的全排列。每種排列佔一行,數字間無空格。排列的輸出順序為字典序,即序列a​1,a​2,⋯,an排在序列b​1,b2,⋯,bn之前,如果存在k使得a1=b1,⋯,ak=bk並且 ak+1

< bk+1。

3
123

132213

231312

321

全排列生成演算法

所謂字典序,就是將元素按照字典的順序(a-z,1-9)進行排列。strcmp就是以字典序來比較字串。

設p是集合

\ 的乙個全排列:p0p1…pj-1pjpj+1…pn

集合必須按照遞增順序排列好

從下標n開始遞減,找出第乙個比右邊數字小的數字序號i

p

i

+1

p_ipi

​+1​在pi右邊的數字裡,找到所有比pj大的數字中最小的數字pk,即

k

=min

⁡k=\min\

k=min交換pi,pj

i右邊的序列pi+1pi+2…pn逆置,變為pnpn-1…pi+1

c++**如下

#include

#include

intfact

(int n )

;void

dictseq

(int a,

int n )

;void

reverse

(int a,

int n,

int j )

;void

swaq

(int

&a,int

&b )

;void

print_array

(int a,

int n )

;int

main

(void

)int total =

fact

(n);

//全排列個數等於n!

print_array

( a, n )

;//初始序列算一種排列, 在交換之前單獨輸出

for(

int i =

1; i < total; i++

)return0;

}void

dictseq

(int a,

int n )

}int min_j = i +1;

int min = a[min_j]

;for

(int j = min_j; j < n; j++)}

swaq

( a[min_j]

, a[i]);

reverse

( a, n, i )

;print_array

( a, n );}

void

reverse

(int a,

int n,

int i )

}int

fact

(int n )

while

( n >0)

;return fact;

}void

swaq

(int

&a,int

&b )

void

print_array

(int a,

int n )

printf

("\n");

}

資料結構 鍊錶PTA習題

6 3 建立學生資訊鍊錶 20分 6 4 學生成績煉表處理 20分 題號題目答案1 結點的單鏈表中,實現下列哪個操作,其演算法的時間複雜度是o n 遍歷鍊錶和求鍊錶的第i個結點 2對於乙個具有n個結點的單鏈表,在給定值為x的結點後插入乙個新結點的時間複雜度為 o n 3線性表若採用鏈式儲存結構時,要...

PTA資料結構習題(浙江大學)

感謝疫情期間pta開放免費練習,趁著這個機會補一下資料結構的代 include include include struct stud node struct stud node createlist struct stud node deletelist struct stud node head...

pta資料結構

是否二叉搜尋樹 這題只要是了解二叉查詢樹的特點。bool isbst bintree t while right1 return isbst t left isbst t right 線性探測法的查詢函式 主要注意雜湊函式,這裡那個常量是真的坑,卡了半天。position find hashtabl...