求字符串所以的排序
比如字符串"abcd"的全排列,有24种,但是算法说是递归的方法,我不明白实现的方法,
求高手指教具体内容解释一下,要是结合程序就更感谢了。
[解决办法]
先看看非递归的吧:
//全排列的非递归实现#include <stdio.h>#include <stdlib.h>#include <string.h>void Swap(char *a, char *b){ char t = *a; *a = *b; *b = t;}//反转区间void Reverse(char *a, char *b){ while (a < b) Swap(a++, b--);}//下一个排列bool Next_permutation(char a[]){ char *pEnd = a + strlen(a); if (a == pEnd) return false; char *p, *q, *pFind; pEnd--; p = pEnd; while (p != a) { q = p; --p; if (*p < *q) //找降序的相邻2数,前一个数即替换数 { //从后向前找比替换点大的第一个数 pFind = pEnd; while (*pFind <= *p) --pFind; //替换 Swap(pFind, p); //替换点后的数全部反转 Reverse(q, pEnd); return true; } } Reverse(p, pEnd);//如果没有下一个排列,全部反转后返回true return false;}int QsortCmp(const void *pa, const void *pb){ return *(char*)pa - *(char*)pb;}int main(){ printf(" 全排列的非递归实现\n"); printf(" --by MoreWindows( http://blog.csdn.net/MoreWindows )--\n\n"); char szTextStr[] = "abc"; printf("%s的全排列如下:\n", szTextStr); //加上排序 qsort(szTextStr, strlen(szTextStr), sizeof(szTextStr[0]), QsortCmp); int i = 1; do{ printf("第%3d个排列\t%s\n", i++, szTextStr); }while (Next_permutation(szTextStr)); return 0;}
[解决办法]
参考这篇http://blog.csdn.net/maleo/article/details/497057文章。