为什么数组中的元素不应该更改?

时间:2019-07-22 17:41:27

标签: c# recursion

我正在编写用于合并排序的代码,我使用带有列表的对象数组,然后将这些列表进行排序和合并,我知道这有些奇怪,并且可能有更好的方法。当我递归回到下面代码中的函数时,元素多于应有的数量,而我只是不知道为什么会发生。

public static void RecurseSort(Array arr)
{
    Array ForWork = arr;

    if (ForWork.Length == 1)
    {
        MessageBox.Show("recurs finish");
    }
    else
    {
        List<object> ForRecurse = new List<object>();
        Array arrCopy = new object[ForWork.Length / 2];

        for (int i = 0; i < ForWork.Length - 1; i = i + 2)
        {
            List<int> r1 = (List<int>)ForWork.GetValue(i);
            List<int> r2 = (List<int>)ForWork.GetValue(i + 1);

            if (i == ForWork.Length - 3)
            {
                List<int> r3 =
                (List<int>)ForWork.GetValue(ForWork.Length - 1);

                r2.Add(r3[0]);
            }

            ForRecurse.Add(CompareAndMerge(r1, r2));
        }

        arrCopy = ForRecurse.ToArray();
        RecurseSort(arrCopy);
    }
}

before

after

因此arrCopy具有正确数量的元素,但是从字面上看,当我在Visual Studio调试器中按“继续”时,arr [3]的计数为3,而应为2。

2 个答案:

答案 0 :(得分:1)

分而治之-将其分解为较小的问题并加以解决。

复制

如何将数据从数组A复制到数组B,例如,结果如何:

int[] src  = { 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270 };
int[] dest = { 17, 18, 19, 20 };
int length = 2;

Array.Copy(src, 4, dest, 2, length);

算术

如何将数组除以2-除以2,但是如果大小不均匀,例如:7,将得到以下结果:

var length = 7;
var result = length / 2;

类型约束

var length = 7d;
var result = length / 2;

合并2个排序的数组

在合并排序中,您可以使用另一种排序方式,例如插入排序,如果仅剩几个元素,例如:20。因此,如果按照插入排序方式给出,如何拆分37个数组将随机数分成2个分词,对其进行排序并合并。

  static class InsertionSort<T> where T : IComparable {
    public static void Sort(T[] entries, Int32 first, Int32 last) {
      for (var index = first + 1; index <= last; index++)
        insert(entries, first, index);
    }

    private static void insert(T[] entries, Int32 first, Int32 index) {
      var entry = entries[index];
      while (index > first && entries[index - 1].CompareTo(entry) > 0)
        entries[index] = entries[--index];
      entries[index] = entry;
    }
  }

此外,调试器是您的朋友。

答案 1 :(得分:0)

很难说,因为您没有提供工作示例的全文。但是我怀疑您在不应该保留对数组中对象的引用的情况下。 但最重要的是,我建议您重写代码,使其不使用强制转换。尝试使用列表列表-List<List<int>>-它将被严格键入并清除算法。另外,我建议编写它以将具体类型进行排序-int,然后使用将接受类型<T>进行排序的方法转换为通用实现。