我正在编写用于合并排序的代码,我使用带有列表的对象数组,然后将这些列表进行排序和合并,我知道这有些奇怪,并且可能有更好的方法。当我递归回到下面代码中的函数时,元素多于应有的数量,而我只是不知道为什么会发生。
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);
}
}
因此arrCopy具有正确数量的元素,但是从字面上看,当我在Visual Studio调试器中按“继续”时,arr [3]的计数为3,而应为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;
在合并排序中,您可以使用另一种排序方式,例如插入排序,如果仅剩几个元素,例如: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>
进行排序的方法转换为通用实现。