【问题标题】:IndexOutOfRangeException with Merge sort [closed]合并排序的 IndexOutOfRangeException [关闭]
【发布时间】:2013-11-03 16:32:27
【问题描述】:

我的课程是这样设计的:

    class MergeSort
    {
        int[] mArray;
        public MergeSort(int[] A)
        {
            mArray = A;
        }
        void Merge(int[] A,int p ,int q, int r)
        {
            int n1 = q - p + r;
            int i = 0, j = 0;
            int n2 = r - q;
            int[] left = new int[n1+1];
            int[] right = new int[n2+1];
            for ( i = 0; i < n1; i++)
                left[i] = A[p + i - 1];
            for ( i = 0; i < n2; i++)
                right[i] = A[q + i];
            left[n1] = Int32.MaxValue;
            right[n2] = Int32.MaxValue;
            i = j = 0;
            for (int k = p; k < r; k++)
            {
                if (left[i] <= right[j])
                {
                    A[k] = left[i];
                    i++;
                }
                else
                {
                    A[k] = right[j];
                    j++;
                }
            }

        }
        public void Merge_Sort(int[] A, int p, int r)
        {
            int q = 0;
            mArray = A;
            if(p<r)
            {
                q = (p+r)/2;
                Merge_Sort(A,p,q);
                Merge_Sort(A, q + 1, r);
                Merge(A,p,q,r);
            }
        }
        public string show()
        {
            StringBuilder sb = new StringBuilder(); 
            for (int i = 0; i < mArray.Length; i++)
            {
                sb.Append(mArray[i].ToString() + " ");
            }
            return sb.ToString();
        }
    }

这就是我进行排序的方式:

        int[] arr = { 10, 12, 5, 6, 30, 1, 11, 120, 12 };
        MergeSort ms = new MergeSort(arr);
        ms.Merge_Sort(arr, 0, arr.Length );
        MessageBox.Show(ms.show());

但我在我的Merge 函数的许多地方不断收到错误Index was outside the bounds of the array.。我试图实现 CLRS(Coremen) 书中所述的算法。但是我一直收到这个错误,我从 3 天开始就一直在这个错误 - 请帮助。

【问题讨论】:

    标签: c# algorithm c#-4.0 sorting mergesort


    【解决方案1】:

    left[i] = A[p + i - 1]; 行中有一个错误,因为您为参数传递了错误的值。实际上,在那一行中,p 为零。在第一次执行循环时,有i=0A数组中的结果位置是-1,这会导致IndexOutOfRange异常,如下所示:

    【讨论】:

    • 我想我完全知道我在哪里得到了错误,问题不在于我在哪里得到了关于寻求解决方案的错误。看到这个答案也得到了 2 票,这很荒谬。为什么?因为有人能够使用调试器来查找运行时错误。来一个,即使我能做到。
    • @Lohit 我回答的目的是向您解释为什么会出现这些错误(实际上,错误是在哪里,不是您要求的,我不在乎)以及原因,那就是您需要检查算法,因为您正在做的事情是错误的,因为您为参数传递了错误的值。更可笑的是,有人在这里求助,他甚至无法弄清楚错误的原因并研究出更好的解决问题的方法。
    • @Lohit 解决你的作业或给你一个可行的算法不是我的工作。在这里,在 SO 中,每个人都在寻求帮助,人们不解决你的问题,也不为你工作。他们可以就问题所在和/或如何解决问题向您提供建议。学习、理解和解决问题取决于您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2018-08-01
    • 2017-10-13
    • 2014-01-08
    相关资源
    最近更新 更多