next_permutation()函式 (數字1~10內實現全排列)
阿新 • • 發佈:2019-01-09
原始碼:
template<calss BidrectionalIterator>
bool next_permutation(BidrectionalIterator first,BidrectionalIterator last)
{
if(first == lase) return false; /* 空區間 */
BidrectionalIterator i = first;
++i;
if(i == last) return false; /* 只有一個元素 */
i = last; /* i指向尾端 */
--i;
for(;;)
{
BidrectionalIterator ii = i;
--i;
/* 以上鎖定一組(兩個)相鄰元素 */
if(*i < *ii) /* 如果前一個元素小於後一個元素 */
{
BidrectionalIterator j = last; /* 令j指向尾端 */
while(!(*i < *--j)); /* 由尾端往前找,直到遇到比*i大的元素 */
iter_swap(i,j); /* 交換i,j */
reverse(ii,last); /* 將ii之後的元素全部逆序重排 */
return true;
}
if(i == first) /* 進行至最前面了 */
{
reverse(first,last); /* 全部逆序重排 */
return false;
}
}
}
template<calss BidrectionalIterator>
bool next_permutation(BidrectionalIterator first,BidrectionalIterator last)
{
if(first == lase) return false; /* 空區間 */
BidrectionalIterator i = first;
++i;
if(i == last) return false; /* 只有一個元素 */
i = last; /* i指向尾端 */
--i;
for(;;)
{
BidrectionalIterator ii = i;
--i;
/* 以上鎖定一組(兩個)相鄰元素 */
if(*i < *ii) /* 如果前一個元素小於後一個元素 */
{
BidrectionalIterator j = last; /* 令j指向尾端 */
while(!(*i < *--j)); /* 由尾端往前找,直到遇到比*i大的元素 */
iter_swap(i,j); /* 交換i,j */
reverse(ii,last); /* 將ii之後的元素全部逆序重排 */
return true;
}
if(i == first) /* 進行至最前面了 */
{
reverse(first,last); /* 全部逆序重排 */
return false;
}
}
}