c# - MergeSort() 实现返回初始未排序数组
问题描述
每次我运行它时,它都会返回一个未排序的数组。我已经放置了一些代码来告诉我事情在哪里发生和没有发生,但看起来一切正常,但它实际上不会对任何事情进行排序。
public static int[] MergeSort(int[] array)
{
if(array.Length <= 1)
{
return array;
}
(int[], int[]) p = SplitArray(array);
int[] left = MergeSort(p.Item1);
int[] right = MergeSort(p.Item2);
return Merge(left, right);
}
public static int[] Merge(int[] low, int[] high)
{
int[] middle = new int[(low.Length + high.Length + 1)];
int count = 0;
foreach (int item in low)
{
Console.WriteLine("low: " + item + ',');
}
foreach (int item in high)
{
Console.WriteLine("high: " + item + ',');
}
int low_index = 0;
int high_index = 0;
while (low_index < low.Length && high_index < high.Length)
{
if(low[low_index] < high[high_index])
{
middle.SetValue(low[low_index], count);
low_index++;
count++;
Console.WriteLine("Low inserted.");
}
else
{
middle.SetValue(high[high_index], count);
high_index++;
count++;
Console.WriteLine("High inserted.");
}
}
if (low_index == low.Length)
{
high.CopyTo(middle, high_index);
}
else
{
low.CopyTo(middle, low_index);
}
return middle;
}
public static (int[], int[]) SplitArray(int[] k)
{
int MAXINDEX = k.Length - 1;
int count = 0;
int[] a = new int[(MAXINDEX / 2)];
int[] b = new int[(MAXINDEX / 2)];
for (int i = 0; i < (MAXINDEX / 2); i++)
{
a[i] = k[i];
}
for (int i = ((MAXINDEX / 2) + 1); i < MAXINDEX; i++)
{
b[count] = k[i];
count++;
}
return (a, b);
}
我不知道我哪里错了。每次回到这里,我可能只是因为非常疲倦而忽略了一些事情。我基本上打印了一堆应该使用控制台发生的事情,这一切似乎都是正确的,我正在失去理智。
解决方案
好的,我认为主要错误是 high.copyTo(...) 和 low.copyTo(...) 的函数索引错误
这里是完整的源代码(经过测试):
public static int[] MergeSort(int[] array)
{
if (array.Length <= 1)
{
return array;
}
Tuple<int[], int[]> p = SplitArray(array);
int[] left = MergeSort(p.Item1);
int[] right = MergeSort(p.Item2);
return Merge(left, right);
}
public static int[] Merge(int[] low, int[] high)
{
int[] middle = new int[low.Length + high.Length];
int count = 0;
foreach (int item in low)
{
Console.WriteLine("low: " + item + ',');
}
foreach (int item in high)
{
Console.WriteLine("high: " + item + ',');
}
int low_index = 0;
int high_index = 0;
while (low_index < low.Length && high_index < high.Length)
{
if (low[low_index] < high[high_index])
{
middle[count] = low[low_index];
low_index++;
count++;
Console.WriteLine("Low inserted.");
}
else
{
middle[count] = high[high_index];
high_index++;
count++;
Console.WriteLine("High inserted.");
}
}
if (low_index == low.Length)
{
for (; count < middle.Length; count++)
{
middle[count] = high[high_index];
high_index++;
}
// alternate: Array.Copy(high, high_index, middle, count, middle.Length - count);
}
else
{
for (; count < middle.Length; count++)
{
middle[count] = low[low_index];
low_index++;
}
// alternate: Array.Copy(low, low_index, middle, count, middle.Length - count);
}
return middle;
}
public static Tuple<int[], int[]> SplitArray(int[] k)
{
int half = k.Length / 2;
int[] a = new int[half];
int[] b = new int[k.Length - half];
int k_index = 0;
for (int i = 0; i < a.Length; i++)
{
a[i] = k[k_index];
k_index++;
}
for (int i = 0; i < b.Length; i++)
{
b[i] = k[k_index];
k_index++;
}
return new Tuple<int[], int[]>(a, b);
}
推荐阅读
- vba - Microsoft project - 扫描和传输任务使用情况视图数据
- asp.net-mvc - ASP.NET CORE Checkbox 如何检查是否为真?
- http-headers - 如何使我的获取请求自动包含“Last-Modified”标头?
- javascript - 为烧瓶中的所有用户创建实时、定时和同步的事件序列
- excel - 有没有办法根据与其他空白单元格的接近程度来编辑单元格文本?
- windows-installer - MSI 安装程序应用程序安装文件夹位置
- azure - 用于从 AKS 出口的意外公共 IP
- react-native - 嵌套文本元素 onPress 没有效果,这是为什么呢?
- java - 无法在 R 中加载 rJava 包
- java - Gson不要在Java中绑定列表