我在C#中实现了插入排序算法。该方法返回List<List<string>>
,记录List
所经历的所有步骤和更改,已选择的变量等。
以下是方法:
public List<List<int>> SortStepByStep(List<int> set)
{
List<List<int>> steps = new List<List<int>>();
steps.Add(set);
for (int c1 = 1; c1 < set.Count; c1++)
{
Console.WriteLine(steps[0][0].ToString());
int item = set[c1];
set.Add(item);
steps.Add(set);
set.RemoveAt(set.Count - 1);
// ^^^^ This is just to visually display what number is being selected.
set.RemoveAt(c1);
steps.Add(set);
bool inserted = false;
for (int c2 = 0; c2 < c1; c2++)
{
if ((set[c2] > item || c2 == c1 - 1) && !inserted)
{
set.Insert((set[c2] <= item && (c2 == c1 - 1) ? c2 + 1 : c2), item);
steps.Add(set);
inserted = true;
break;
// Added the break in anyway because sometimes the inserted boolean failed to work.
}
}
}
return steps;
}
该方法实际返回的只是“步骤”的每个索引处的最终排序列表。我已经跟着它将“步骤”写入控制台并且可以看到它逐渐变化,但不明白为什么。
其他答案提到在for循环中实例化,但我认为这不适用于此。
可能是什么问题?
答案 0 :(得分:1)
步骤列表将引用列入同一个集合。因此,一旦修改设置,步骤的每个元素都会显示更新的值(它们指向同一个对象)。
尝试将steps.Add(set);
更改为steps.Add(set.ToList())
或steps.Add(new List<int>(set))
,这应该创建新列表而不是引用旧列表。