如輸入不同的數字使其排列後從小到大順序輸出,如:
123則可以輸出如下組合
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
共六種情況
後面將問題簡化一下,輸入1-9代表不同的數字1~9,如輸入4則對1234進行排序。
1. 數學法
觀察a1,a2,a3,...,an的排列情況,假設我需要第k個排列結果。(注意:a1如果第乙個元素a1不需要交換,一共有(n-1)!種排列,當k>(n-1)!時,第乙個元素必定不是a1了,那會是哪個元素呢?
以這個元素為開頭的排列
排列序號
a11~(n-1)!
a2(n-1)!+1~2*(n-1)!
an(n-1)*(n-1)!+1~n!
那麼一直求第k個序號的排列,就可以確定第乙個元素是多少;
確定第乙個元素後,下一層每個元素的範圍則縮小到(n-2)!,而問題與上述無異,也就是說,可以利用這種規律,逐個元素求出這個排列。
假設數串為1234,總共有4!=24種排列情況,求第15種排列結果。
第乙個元素則為[(15-1)/3!]+1=3,取1234中的第三個作為a1,k=15-6*2=3,未用元素為124
第二個元素則為[(3-1)/2!]+1=2,取124中的第二個作為a2,k=3-2*1=1,未用元素為14
由於為1,所以剩餘的則為14順序
結果為3214
我們按順序寫一下,確保準確無誤
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
432112
3456
78910
1112
1314
1516
1718
1920
2122
2324
那麼我們用**把它實現即可(當然,你的實現方法可能更好,因為是很久前寫的,將就著看吧)
#include #include #include int find_kth_element(int n, int kth, int **ans)
//free(used);
return 0;
}int main(void)
newnum = (int*)malloc(sizeof(int)*n);
memcpy(newnum, num, sizeof(int)*n); //不恢復序列就是從小到大,一層交換例子 1 2 3 4->2 1 3 4->3 1 2 4->4 1 2 3
//-------->問題**,全排列結果非從小到大
for(kk=k; kk9)
return 0;
num = (int*)malloc(sizeof(int)*n);
for(k=0; k規律:
在當前序列中,從尾端往前尋找兩個相鄰元素,前乙個記為*i,後乙個記為*ii,並且滿足*i < *ii。然後再從尾端尋找另乙個元素*j,如果滿足*i < *j,
即將第i個元素與第j個元素對調,並將第ii個元素之後(包括ii)的所有元素顛倒排序,即求出下乙個序列了。
比如:12345開始組合排列,12354,12435,...,12543,在12位置不變情況下,最大組合情況為12543,然後,比2略大的數必定在從後向前搜尋到的第乙個數,所以改為13542,此時需要從最小組合開始,對542進行排序,得到結果13245;
又當13位置不變,其最大為13542,向後搜尋到比3大的為4,則改為14532,然後對4之後的數排序,的14235. 排序複雜度決定這個演算法複雜度。
#include #include int find(int *d, int n, int *i, int *ii, int *j)
} if(k==0)
return -1;
for(k=n-1; k>=0; k--)
} return 0;
}int partition(int *d, int low, int high)
return low;
}void quick_sort(int *d, int low, int high){
int mid;
if(low0&&n<10){
d = (int*)malloc(sizeof(int)*n);
for(k=0; k
排列組合 有序進行全排列的幾種方法
如輸入不同的數字使其排列後從小到大順序輸出,如 123則可以輸出如下組合 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 共六種情況 後面將問題簡化一下,輸入1 9代表不同的數字1 9,如輸入4則對1234進行排序。1.數學法 觀察a1,a2,a3,an的排列情況,假設我需要...
排列組合的幾種情況
n個不同的球,放到m個不同的袋子有多少種組合?這種是最簡單的情況,對於每個球的放置方法,都有m中選擇,可以任意從m個袋子選乙個袋子放置,那麼組合的數量為 m m m,其中m的個數是n,則最終結果是m的n次方 n個相同的球,放到m個不同的袋子有多少種組合?這裡可以利用插板法,兩個插板的間隙表示袋子,題...
排列組合的幾種情況
n個不同的球,放到m個不同的袋子有多少種組合?這種是最簡單的情況,對於每個球的放置方法,都有m中選擇,可以任意從m個袋子選乙個袋子放置,那麼組合的數量為 m m m,其中m的個數是n,則最終結果是m的n次方 n個相同的球,放到m個不同的袋子有多少種組合?這裡可以利用插板法,兩個插板的間隙表示袋子,題...