演算法學習日記 字典法排序

2021-07-04 18:31:23 字數 1272 閱讀 7982

演算法學習日記  字典法排序

問題:給出給定序列的全排列

例如:序列為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...