一、思想——全排列
依次將待排列的陣列的後
n-1個元素分別與與第乙個元素交換
,則每次遞迴處理的都是後
n-1個元素的全排列。當陣列元素僅有乙個e為此遞迴演算法的出口。
也就是說交換的步驟是這樣的:
(1)第乙個數與第乙個數交換,然後對第乙個數後面的所有數進行排列。當對後面的數進行排列的時候,將這組資料中的第乙個數與第乙個數交換.....這樣一直交換下去,當只剩乙個資料的時候輸出,即第一次得到的結果就是原陣列
(2)整個陣列中的第二個數與第乙個數進行交換,對交換後得到的陣列中從第二個數開始再進行第(1)步
(3)這次就是第三個數與第乙個數交換....
(4)依次這樣交換下去,但是要注意的是在每次交換後得出一組排序結構之後,都要再將資料交換回去,變成原陣列,再進行下一輪的交換
第乙個數與第乙個數交換
第二個資料與第乙個資料進行交換
第三個數與第乙個數進行交換
三、**展示:
templatevoid perm(type list, int k, int m) // m是陣列最後乙個元素的下標
{ if(k == m)
{ for(int i=0; i<=m; i++)
{ cout請注意,當我們每次將後面的數與第乙個數交換後一定要記得將這組資料再交換變回原來的樣子,每次後面的數與第乙個數在交換的時候都是在原資料的基礎上交換的
輸入一組不重複數字,全排列
全排列是我們讀書時課堂上已經學過東西,給出1,2,3三個數,有多少個組合方式呢?123,132,213,231,312,321 很快我們就能給出這組數的全排列,全排列個數 n n 1 n 2 1 n 看起來很easy,我以為 實現起來分分鐘的事情,然後並沒有 這是我一口氣寫完的 輸出卻什麼都沒有 v...
利用分治法求一組資料中最大的兩個數和最小的兩個數。
利用分治法求一組資料中最大的兩個數和最小的兩個數。在這裡插入 片 include define n 10 void max min int a,int m,int n,int min1,int min2,int max1,int max2 int main void int min1,min2 in...
利用分治法求一組資料中最大的兩個數和最小的兩個數。
解題思路 二分法,保留每個子問題的最小的兩個數和最大的兩個數 方案一 include include include float a 100 float max1,max2,min1,min2 min1void min maxtwo int i,int j,float fmin2,float fmi...