演算法學習日記 字典法排序
問題:給出給定序列的全排列
例如:序列為1 2 3
輸出為 123 132 213 231 312 321
問題分析:
(1)如何對一組數找到他的全排列
解答:採用字典序排列演算法。用字典序法得到全排列的思路大概是這樣的:我們需要有乙個初始的排列狀態,對於這個排列,用字典序法轉換就得到下乙個排列。我們把初始狀態設定為字元從小到大地排,不斷地用字典序法得到它的下乙個排列,直到最後乙個排列為止,而最後乙個排列就是字元從大到小地排嘍。比如說5
個數字的所有的排列中最前面的是
12345
,最後面的是
54321。
具體演算法如下
設p是1~
n的乙個全排列
:p=p1p2......pn=p1p2......pj-1pjpj+1......pk-1pkpk+1......pn
(1)從排列的右端開始,找出第乙個比右邊數字小的數字的序號j(
j從左端開始計算),即
j=max
(右邊的數從右至左是遞增的,因此
k是所有大於
pj的數字中序號最大者)
(3)對換pi,
pk,再將
pj+1......pk-1pkpk+1pn倒轉得到排列p』』=p1p2.....pj-1pjpn.....pk+1pkpk-1.....pj+1,這就是排列p的下乙個下乙個排列。 例如
839647521
是數字1~9
自右至左找出排列中第乙個比右邊數字小的數字
4 839647521
在該數字後的數字中找出比
4大的數中最小的乙個
5 839647521將5
與4交換 839657421
將7421
倒轉 839651247 所以
839647521
的下乙個排列是
839651247。
原始碼如下
#include #include #include #define array_max 5
void invert_array(int *begin,int *end)
{ int temp;
while(begin=0&&list[i]>list[i+1])
i--;
if(i<0) break;
point=i;
begin=&list[i+1];
min=1000;
for(j=i;jlist[i])&&(list[j]
演算法學習之氣泡排序法
sub bubblesorted dim k as integer randomize with worksheets sheet1 for k 1 to 100 cells k,1 int rnd 10 1 在第一列生成100個隨機整數 next for i 1 to 99 for j i 1 t...
排序演算法學習
一直都想把排序和搜尋類的演算法總結一下,一直拖著沒寫,主要是太懶了,現在決定還是要再好好學習下這些基本的演算法。畢竟基礎真的是很重要。好了現在開始學習第乙個排序演算法 插入排序 我記得插入排序在我們以前的資料結構教程上是第乙個介紹的 插入排序 聽這個排序名字就是將乙個什麼數要插入到某個地方,不錯,他...
排序演算法學習
1.氣泡排序 using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace 排序演算法練習 從小排序 public ov...