字典序演算法如下:
設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,我們從後往前尋...