日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

STL经典算法集锦之排列(next_permutation/prev_permutation

發(fā)布時(shí)間:2025/3/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL经典算法集锦之排列(next_permutation/prev_permutation 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

STL經(jīng)典算法集錦之排列(next_permutation/prev_permutation)

來(lái)自:CSDN博客推薦文章 | 時(shí)間:2012-05-07 14:54:09

原文鏈接: http://blog.csdn.net/xinhanggebuguake/article/details/7542542

相關(guān)主題: 1100008311010017

STL中涉及到數(shù)組的排列的有兩個(gè)函數(shù),即next_permutation/prev_permutation,分別用于求上一個(gè)以及下一個(gè)排列。兩函數(shù)的算法使用的原理大體相同。以next_permutation為例,列出算法并解釋。

算法:

首先,從最為段開(kāi)始往前尋找兩個(gè)相鄰的元素,令第一個(gè)元素索引為endi第二個(gè)元素索引為endii,且滿(mǎn)足array[endi]<array[endii]。然后,再?gòu)淖钗捕碎_(kāi)始向前檢測(cè),找到第一個(gè)大于array[endi]的元素,令其為索引j。將元素array[endi],array[j]對(duì)調(diào),然后將endii之后的所有元素顛倒排列。即求的下一個(gè)排列。

解釋:

一、如果數(shù)組k以后的是一個(gè)遞減序列,則僅依靠調(diào)換k以后的元素不可能完成任務(wù),所以必須找到滿(mǎn)足k>k+1的元素,即保證k以后的序列不遞減。

二、滿(mǎn)足一之后,那么下一個(gè)序列的第k位一定是從后面找到剛好比a[k]大的一個(gè)比a[k]大的一個(gè)數(shù)打頭的(為了保證剛好大于,又k+1之后的元素遞減,所以從數(shù)組尾開(kāi)始找到第一個(gè)比a[k]大的元素即可滿(mǎn)足要求)。將這個(gè)數(shù)的索引記為j。

三、將a[j]a[k]對(duì)調(diào)。此時(shí),j后面的元素是降序的。所以需要把j后面的逆轉(zhuǎn)一下,從降序到升序,如此就得到了恰好比之前序列大一號(hào)的序列。

代碼:next_permutation

bool nextPermutation(int array[],int len) {int endi=len-1;int endii;if(len==1)return false;while(true){endii=endi;endi--;if(array[endi]<array[endii])// 如果前一個(gè)元素小于后一個(gè)元素{int j=len;while(array[--j]<array[endi]);// 由尾端往前找,直到遇上比array[endi]大的元素swap(array[j],array[endi]); // 交換找到的元素reverse(array+endii,array+len-1);// 將 endii 之后的元素全部逆向重排return true;}if(endi==0)//排列已至最大,無(wú)下一個(gè)排列{reverse(array,array+len-1);return false;}} } 代碼:prev_permutation

bool prevPermutation(int array[],int len) {int endi=len-1;int endii;if(len==1)return false;while(true){endii=endi;endi--;if(array[endi]>array[endii])// 如果前一個(gè)元素大于后一個(gè)元素{int j=len;while(array[--j]>array[endi]);// 由尾端往前找,直到遇上比array[endi]小的元素swap(array[j],array[endi]); // 交換找到的元素reverse(array+endii,array+len-1);// 將 endii 之后的元素全部逆向重排return true;}if(endi==0)//排列已至最小,無(wú)上一個(gè)排列{reverse(array,array+len-1);return false;}} }



總結(jié)

以上是生活随笔為你收集整理的STL经典算法集锦之排列(next_permutation/prev_permutation的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。