全排列演算法之字典序法

2021-05-24 13:45:07 字數 794 閱讀 7530

字典序演算法如下:

設p是1~n的乙個全排列:p=p1p2......pn=p1p2......pj-1pjpj+1......pk-1pkpk+1......pn

1)從排列的右端開始,找出第乙個比右邊數字小的數字的序號j(j從左端開始計算),即 j=max   

index--;  

}   

return index;

}   

//在pj的右邊的數字中,找出所有比pj大的數中最小的數字pk,即 k=max

int findk(char array,int index)

}   

return min;

}//對換pi,pk

void exchangeindex1andindex2(char array,int index1,int index2)

//將pj+1......pk-1pkpk+1pn倒轉

void reversefromindextoend(char array,int index)

}   

void dictionaryorder(char array)

else

k = findk(array,j);

exchangeindex1andindex2(array,j,k);

reversefromindextoend(array,j+1);

}   

printf("%d:",num++);

outputarray(array);

}   

}int main()

全排列之字典序法

1 對於輸入的字典序排列,反向查詢第一對滿足a j 2 仍舊反向查詢第乙個下標k,使得 a j 3 交換a j 和a k 4 翻轉a j 1 a end 此法能適應有重複元素的系列 如下 include include using namespace std int cmp const void a...

演算法 全排列問題 字典序法

求乙個排列的下乙個排列我們有暴力的n進制法,當然也就有效率較高的字典序法。洛谷1088 火星人 題目描述 求排列a 1 a 2 a 3 a n 之後的第m個全排列。輸入格式 共三行。第一行乙個正整數n 1 n 10000 第二行乙個正整數m 1 n 100 下一行是1到n這n個整數的乙個排列,用空格...

全排列演算法的字典序排列

之前在中描述了全排列演算法的遞迴解法,這裡再說一種演算法 字典序排列。字典序排列就是按照字典a z,1 9的順序給出字串的順序全排列,例如abc的全排列就是從abc一直排到cba。那麼給定乙個字串,怎麼找出恰好大於該字串的下乙個排列呢?我們考慮如下的步驟 1 假設字串為p1p2 pn,我們從後往前尋...