当前位置:   article > 正文

C++:字母按字典序的全排列_字母全排列c++

字母全排列c++

要点:相比于普通的递归全排列,按字典排序的全排列需要用到排序函数(下面代码中的Sort函数),要为字符先排好序(按ASCLL值),再进行递归排列。

普通的递归全排列(可与本文的代码比较来看):https://blog.csdn.net/qq_40760732/article/details/100098306

注意:Perm(char list[],int p,int q)做的是数组list[]中下标值p与q之间所有元素的全排列,再Perm函数中调用Sort(list,p,q+1)做的是下标值为p到q+1之间元素的全排列,每次递归p值都会加一,即每次都会对除下标值为零之外的元素进行排序。

  1. #include<iostream>
  2. using namespace std;
  3. void Sort(char a[], int g, int b); //声明排序函数,对下标值为g到b之间的元素进行排序
  4. void Swap(char& a, char& b)
  5. {
  6. char tem;
  7. tem = a;
  8. a = b;
  9. b = tem;
  10. }
  11. void Perm(char list[], int p, int q)
  12. {
  13. if (p == q)
  14. {
  15. for (int i = 0; i <= q; i++)
  16. cout << list[i];
  17. cout << ' ';
  18. }
  19. else
  20. {
  21. for (int i = p; i <= q; i++)
  22. {
  23. Sort(list,p, q + 1); //每次递归都要排序
  24. Swap(list[i], list[p]);
  25. Perm(list, p + 1, q);
  26. Swap(list[i], list[p]);
  27. }
  28. }
  29. }
  30. //排序函数(选择排序法)
  31. void Sort(char a[],int g,int b)
  32. {
  33. char tem;
  34. int m,n;
  35. for (int i = g; i < b; i++)
  36. {
  37. m = i;
  38. for (int j = i + 1; j < b; j++)
  39. {
  40. if (a[m] > a[j])
  41. {
  42. m = j;
  43. }
  44. }
  45. if (m != i)
  46. {
  47. tem = a[m];
  48. a[m] = a[i];
  49. a[i] = tem;
  50. }
  51. }
  52. }
  53. int main()
  54. {
  55. int i;
  56. char* a = new char[20];
  57. cin.getline(a, 20,'\n');
  58. for (i = 0; a[i] != ','; i++)
  59. i = i;
  60. Sort(a,0, i);
  61. Perm(a, 0, i-1);
  62. return 0;
  63. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/439689
推荐阅读
相关标签
  

闽ICP备14008679号