演算法思路:全排列可以看做固定前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為...