三種全排序演算法詳解

2021-07-04 10:22:23 字數 2799 閱讀 1850

演算法思路:全排列可以看做固定前i位,對第i+1位之後的再進行全排列,比如固定第一位,後面跟著n-1位的全排列。那麼解決n-1位元素的全排列就能解決n位元素的全排列了,這樣的設計很容易就能用遞迴實現。

附**段:

void permutation1(char* str,int sbegin,int send)    //全排列的非去重遞迴演算法

else

}}

序列有時候可能有重複的字元,當需要輸出去重全排列時,就可以採取以下方法

當第i位與i+n位交換時,i到i+n位中不能有與i+n位相同的字元

比如說23560678,當第三位5與第六位6交換時,中間不能有6,這裡有6所以不進行交換

附**段:

bool comparesub(char* str,int sbegin,int send)  //比較函式,[sbegin,send)中是否有與send的值相等得數

void permutation2(char* str,int sbegin,int send) //全排列的去重遞迴演算法

else}}

}

演算法思路:先排序得到遞增序列,從字串尾部向前找第一雙相鄰的遞增字元,稱前乙個數為替換字元,替換字元的下標稱為替換點,再從該字元後面找到乙個比替換字元大的最小的字元(因為有遞增關係,所以這個數必然存在的),然後再將替換點後的字串逆置。迴圈到最大排序後,逆置並結束演算法

例:字串2568710 先排序得到0125678找到一雙相鄰遞增字元,78,再在7後面的字元裡找到符合演算法的字元8,替換得到字串0125687,再將7後面的字串逆置,得到0125687

附**段:

void reverse(char* a,char* b)   //逆置函式

}bool next_permutation3(char* str) //找到乙個滿足演算法的序列

if(!i) //如果i=0,證明沒有一雙相鄰遞增字元,那麼也就說明整個字串是最大排列

else

str[i - 1] = str[pos];

str[pos] = tmp; //字元替換

char *p = str + i;

char *q = str + (slen - 1);

reverse(p,q); //將替換點後的字串逆置

return true; //下乙個

}}int qsortcmp(const void * pa,const void * pb) //比較函式

void permutation3(char* str) //全排列的去重非遞迴演算法

while(next_permutation3(str));

}

#include #include #include using namespace std;

/*演算法思路:全排列可以看做固定前i位,對第i+1位之後的再進行全排列,比如固定第一位,後面跟著n-1位的全排列。那麼解決n-1位元素的全排列就能解決n位元素的全排列了,這樣的設計很容易就能用遞迴實現。

*/void permutation1(char* str,int sbegin,int send) //全排列的非去重遞迴演算法

else

}}/*

序列有時候可能有重複的字元,當需要輸出去重全排列時,就可以採取以下方法

當第i位與i+n位交換時,i到i+n位中不能有與i+n位相同的字元

比如說23560678,當第三位5與第六位6交換時,中間不能有6,這裡有6所以不進行交換

*/bool comparesub(char* str,int sbegin,int send) //比較函式,[sbegin,send)中是否有與send的值相等得數

void permutation2(char* str,int sbegin,int send) //全排列的去重遞迴演算法

else

}}}/*

演算法思路:先排序得到遞增序列,從字串尾部向前找第一雙相鄰的遞增字元,稱前乙個數為替換字元,替換字元的下標稱為替換點,再從該字元後面找到乙個比替換字元大的最小的字元(因為有遞增關係,所以這個數必然存在的),然後再將替換點後的字串逆置。迴圈到最大排序後,逆置並結束演算法

例:字串2568710 先排序得到0125678找到一雙相鄰遞增字元,78,再在7後面的字元裡找到符合演算法的字元8,替換得到字串0125687,再將7後面的字串逆置,得到0125687

*/void reverse(char* a,char* b) //逆置函式

}bool next_permutation3(char* str) //找到乙個滿足演算法的序列

if(!i) //如果i=0,證明沒有一雙相鄰遞增字元,那麼也就說明整個字串是最大排列

else

str[i - 1] = str[pos];

str[pos] = tmp; //字元替換

char *p = str + i;

char *q = str + (slen - 1);

reverse(p,q); //將替換點後的字串逆置

return true; //下乙個

}}int qsortcmp(const void * pa,const void * pb) //比較函式

void permutation3(char* str) //全排列的去重非遞迴演算法

while(next_permutation3(str));

}int main()

三種排序演算法

1.氣泡排序法 2.選擇排序法 3.插入排序法 由小到大的順序 備註 網上筆試題,是參考網上別人的,具體出處找不到了,請諒解。摘抄記錄下來方便日後學習。如果有問題盡請批評指正,希望可以和大神一起交流。氣泡排序的最好的時間複雜度為o n 最壞的時間為 o n 2 演算法的平均時間複雜度為o n 2 選...

總結 三種全排列演算法

1 遞迴演算法 演算法書上有詳細的解釋,複製如下 設r 是要進行排列的n個元素,ri r 集x中元素的全排列記為perm x ri perm x 表示在全排列perm x 的每乙個排列前加上字首ri得到的排列.r的全排列可歸納定義如下 當n 1時,perm r r是集合r中唯一的元素.當n 1時,p...

三種基本排序演算法

示例陣列 以公升序為例 for int i 0 i arr.length i 輪數 第一次 j下標從0開始,第0位與第1位相比較,當第0位大於第1位時 3 1 進行交換。交換完陣列為 第二次j為1,第1位與第2位比較,3 5,不交換。第三次j為2,第2位與第3位比較,5 2,交換。陣列為 第四次j為...