在C#中实现整数合并排序

时间:2017-06-07 18:56:06

标签: c# mergesort

最近得到了一个冒泡排序算法的功能,并决定我会尝试合并排序算法,我试图从头开始写它作为个人挑战,我觉得好像我的逻辑从根本上有缺陷然而,不知道在哪里寻求建议,我欢迎任何意见。我觉得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];

                }
            }

        }

3 个答案:

答案 0 :(得分:0)

您声明对数组的引用,但从不初始化它们。 BC将为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>