使用Java中的MergeSort:
public void mergeSort(int[] A)
{
if (A.length > 1)
{
int q = A.length/2;
int[] leftArray = Arrays.copyOfRange(A, 0, q);
int[] rightArray = Arrays.copyOfRange(A,q,A.length);
mergeSort(leftArray);
mergeSort(rightArray);
merge(A,leftArray,rightArray);
}
}
Run Code Online (Sandbox Code Playgroud)
上面代码中的递归在Java中运行良好.
因此,为了好奇,我想将函数Arrays.copyOfRange从java转换为c#.C#中的Array.copy有五个参数.你知道c#中的任何更简单的函数都会从位置x到y(比如java)开始获取数组的某些元素.
在c#中我编写了上面这样的方法:
public void mergeSort(int[] A)
{
if (A.Length > 1)
{
int q = A.Length / 2;
int[] leftArray = new int[q];
int[] rightArray = new int[A.Length];
for (int i = 0; i < q; i++)
{
leftArray[i] = A[i];
Console.WriteLine(leftArray[i]);
}
for (int i = q; i < A.Length; i++)
{
rightArray[i] = A[i];
Console.WriteLine(rightArray[i]);
}
Console.ReadKey();
mergeSort(leftArray);
mergeSort(rightArray);
merge(A, leftArray, rightArray);
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我已经用Java中的两个循环替换了Java中的Arrays.copyOfRange函数,这在c#中没有递归.但是,调用mergeSort(leftArray)和mergeSort(rightArray)时,它会在c#中打印出来:
由于StackOverflowException,进程终止!!
关于如何在c#中获取某些元素的任何更好的想法?
问题是移植的数组副本没有做同样的事情.
给定的输入[a,b,c,d,e,f]的Java代码创建两个阵列,[a,b,c]和[d,e,f]而C#端口创建两个阵列,[a,b,c]和[0,0,0,d,e,f].值得注意的是,
new int[A.Length]).这是导致StackOverflowException从未到达终止案例的原因,并且;q索引开始的值,即索引的中间值.考虑这种替换方法使用Array.Copy- 具有相同签名的方法可以用作移植代码中的替换,只要该方法内部具有与原始代码相同的效果.
int[] copyOfRange (int[] src, int start, int end) {
int len = end - start;
int[] dest = new int[len];
Array.Copy(src, start, dest, 0, len);
return dest;
}
Run Code Online (Sandbox Code Playgroud)
或者,使用循环但在原始端口中没有问题的版本.使用谨慎功能的另一个原因 - 它使任务易于查看和推理.能够消除重复的代码也不会有害.
int[] copyOfRange (int[] src, int start, int end) {
int len = end - start;
int[] dest = new int[len];
// note i is always from 0
for (int i = 0; i < len; i++)
{
dest[i] = src[start + i]; // so 0..n = 0+x..n+x
}
return dest;
}
Run Code Online (Sandbox Code Playgroud)
如果你像我一样懒,那么代码也可以使用LINQ轻松编写.
int[] leftArray = A.Take(q).ToArray();
int[] rightArray = A.Skip(q).ToArray();
Run Code Online (Sandbox Code Playgroud)