C#字符串全排序

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列;

全排列:当n==m时,称为全排列;

比如:集合{ 1,2,3}的全排列为:

{ 1 2 3}

{ 1 3 2 }

{ 2 1 3 }

{ 2 3 1 }

{ 3 2 1 }

{ 3 1 2 }

我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致;

算法思路:

(1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀);

(2)出口:如果只有一个元素的全排列,则说明已经排完,则输出数组;

(3)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组;

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
static void Main(string[] args)
       {
           string s = "123";
           char[] str = s.ToCharArray();
           perm(str, 0, s.Length);
           //permNotSame(str, 0, s.Length);
       }
 
       /// <summary>
       /// 全排序
       /// </summary>
       /// <param name="a"></param>
       /// <param name="begin"></param>
       /// <param name="end"></param>
       static void perm(char[] a, int begin, int end)
       {
           if (begin == end)
           {              
               for (int i = 0; i < begin; i++)
               {
                   Console.Write(a[i]);                  
               }
               Console.WriteLine("");
           }
           else
           {
               for (int j = begin; j < end; j++)
               {
                   swap(a, begin, j);
                   perm(a, begin + 1, end);
                   swap(a, j, begin);
               }
           }
       }
 
 
       /// <summary>
       /// 交换数组 索引x和y位置的值
       /// </summary>
       /// <param name="a"></param>
       /// <param name="x"></param>
       /// <param name="y"></param>
       static void swap(char[] a, int x, int y)
       {
           char temp = a[x];
           a[x] = a[y];
           a[y] = temp;
       }      

  测试结果:

 

posted @   lance2008  阅读(898)  评论(0编辑  收藏  举报
编辑推荐:
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 2025成都.NET开发者Connect圆满结束
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 用一种新的分类方法梳理设计模式的脉络
点击右上角即可分享
微信分享提示