【发布时间】:2015-09-28 06:10:48
【问题描述】:
我试图用 C# 编写堆算法的实现,但它不能正常工作。我正在尝试创建一个通用实现,它将找到字符串的所有排列,并将它们添加到列表中。
我是这样开始的:
List<string> permutations = new List<string>();
GenerateHeapPermutations(3, "ABC", permutations);
foreach (var p in permutations)
{
Console.WriteLine(p);
}
Console.ReadKey();
这是我的实现:
public static void GenerateHeapPermutations(int n, string s, List<string> sList)
{
if (n == 1)
{
sList.Add(s);
}
else
{
for (int i = 0; i < n - 1; i++)
{
GenerateHeapPermutations(n - 1, s, sList);
if (n % 2 == 0)
{
// swap the positions of two characters
var charArray = s.ToCharArray();
var temp = charArray[i];
charArray[i] = charArray[n - 1];
charArray[n - 1] = temp;
s = new String(charArray);
}
else
{
var charArray = s.ToCharArray();
var temp = charArray[0];
charArray[0] = charArray[n - 1];
charArray[n - 1] = temp;
s = new String(charArray);
}
}
GenerateHeapPermutations(n - 1, s, sList);
}
}
该算法确实产生了正确数量的排列(在本例中为六个),但排列本身是不正确的:
ABC BAC CBA
BCA ABC BAC
我认为我没有偏离 pseudocode example of Heap's algorithm on Wikipedia,而且由于该算法的递归性质(概念化非常棘手),我很难调试它。
谁能提供任何关于问题可能是什么的见解?
附注不是作业,只是为了好玩。
【问题讨论】:
-
来自伪代码:
procedure generate(n : integer, A : array of any):,但你有GenerateHeapPermutations(int n, string s, List<string> sList)- 为什么要额外的字符串参数? -
@Tim 他只是在保存置换后的字符串。
-
Alex,我已经编辑了我的代码,所以我不会重复自己。
标签: c# algorithm recursion permutation heaps-algorithm