最近得到了一个冒泡排序算法的功能,并决定我会尝试合并排序算法,我试图从头开始写它作为个人挑战,我觉得好像我的逻辑从根本上有缺陷然而,不知道在哪里寻求建议,我欢迎任何意见。我觉得C#不喜欢我的子阵列声明,它们似乎也是一个不正确的解决方案
public static void MergeSort(int[] A) // WIP
{
if (A.Length % 2 == 0 ) //Checks if input array is even
{
int[] B; //Declares sub array
int[] C; //Declares sub array
for (int x = 0; x < A.Length ; x++) //Performs an action for every item item in the array
{
if (x < A.Length / 2) //selects the first half of the input array and assigns it to sub-Array B
{
B[x] = A[x];
}
if(x > A.Length / 2) //Selects the second half of the input array and assigns it to sub-Array C
{
C[x] = A[x];
}
}
}
答案 0 :(得分:0)
您声明对数组的引用,但从不初始化它们。 B
和C
将为null,如果您尝试对它们执行任何操作,则会出现异常。
// Declares *reference* to sub array, and creates it as well.
int[] B = new int[A.Length];
// Declares *reference* to sub array, and creates it as well.
int[] C = new int[A.Length];
您可以使用List<int>
代替数组。
问题是,你只会使用B
的前半部分和C
的后半部分。那是你要的吗?如果您希望B
只是 A
的前半部分,而C
只是 {{}的后半部分{{} 1}},做到这一点。您可以使A
与数组完全相同,但您可以List<int>
使用它,并且它具有Add()
属性而不是Count
属性:
Length
另一件事:我在第二个 var B = new List<int>();
var C = new List<int>();
for (int x = 0; x < A.Length ; x++) //Performs an action for every item item in the array
{
if (x < A.Length / 2) //selects the first half of the input array and assigns it to sub-Array B
{
B.Add(A[x]);
}
if(x > A.Length / 2) //Selects the second half of the input array and assigns it to sub-Array C
{
C.Add(A[x]);
}
}
之前加上else
,为了清晰起见而不是运行时效率。
但是如果x 等于到if
会发生什么?如果在您的问题中未包含的代码中处理该案例,请不要介意。
A.Length / 2
您可以按照以下方式简化该代码:
if (x < A.Length / 2) //selects the first half of the input array and assigns it to sub-Array B
{
B.Add(A[x]);
}
else if(x > A.Length / 2) //Selects the second half of the input array and assigns it to sub-Array C
{
C.Add(A[x]);
}
但是如果你想要展示对基本编程基础而不是C#琐事的掌握,那么你的循环方法是最好的。
答案 1 :(得分:0)
您正在尝试使用未分配的变量(数组B和C),从而出现错误。如果您需要了解数组如何工作here。
如果你初始化int[B] = new int[A.Length / 2];
那么你的代码将编译没有错误。
你的代码应该是这样的,只是为了工作,我没有重构任何东西,只是做了最小化才能使它工作:
public static void MergeSort(int[] A) // WIP
{
if (A.Length % 2 == 0) //Checks if input array is even
{
int[] B = new int[A.Length / 2]; //Declares sub array
int[] C = new int[A.Length / 2]; //Declares sub array
for (int x = 0; x < A.Length; x++) //Performs an action for every item item in the array
{
if (x < A.Length / 2) //selects the first half of the input array and assigns it to sub-Array B
{
B[x] = A[x];
}
if (x > A.Length / 2) //Selects the second half of the input array and assigns it to sub-Array C
{
C[x] = A[x];
}
}
}
}
答案 2 :(得分:0)
现在我的主要问题是如何知道我需要创建多少个数组,以便将所有数组分解为大小为1的数组(当原始输入未知时)我觉得这不是一个非常优化的实现< / p>