【问题标题】:Merge Sort algorithm Infinite loop归并排序算法无限循环
【发布时间】:2013-04-02 16:01:07
【问题描述】:

我正在尝试创建一个合并排序算法,但是当我对分解的数组进行排序时,我进入了一个无限循环,主要问题发生在下面的合并方法中。提前感谢您的帮助。

public static void mergeSort(double[] arr)
{
    int count = n;
    long startTime = System.currentTimeMillis();
    int mid = arr.length;
    if(arr.length > 1)
    {
        mid = arr.length/2;
    }
    else
    {
        return;
    }

    double[] a = new double[mid];
    double[] b = new double[arr.length-mid];

    for(int i = 0; i < a.length; i++)
    {
        a[i] = arr[i];
        System.out.println("A = " + a[i]);
        count++;
    }
    for(int i = 0; i < b.length; i++)
    {
        b[i] = arr[i+mid];
        System.out.println("B = " + b[i]);
        count++;
    }

    mergeSort(a);
    mergeSort(b);
    merge(arr, a, b);
}

public static void merge(double[] arr, double[] a, double [] b)
{
    int elem = a.length + b.length;
    int i,j,k;
    i = j = k = 0;
    while(i < elem )
    {
        if((j < a.length) && (k < b.length))
        {
            if(a[j] < b[k])
            {
                arr[i] = a[k];
                i++;
                j++;
            }
            else
            {
                arr[i] = b[k];
                i++;
                k++;
            }
        }
        else
        {
            if(j >= a.length)
            {
                while(k < b.length)
                {
                    arr[i] = b[k];
                    i++;
                    k++;
                }
            }
            if(k >= b.length)
            {
                while(j >= a.length)
                {
                    arr[i] = a[j];
                    j++;
                    i++;
                }
            }
        }
    }
}

【问题讨论】:

  • 这是您学习如何使用调试器的绝佳机会!
  • int count = n; n 是什么,一个静态的最终尺寸?
  • 是的,n 目前是 10,虽然我只使用 count 作为调试工具。 n 是数组的大小。

标签: java infinite-loop mergesort


【解决方案1】:
while(j >= a.length)
{
    arr[i] = a[j];
    j++;
    i++;
}

我想知道这里发生了什么......

当 j>=a.length 时,做点什么,让 j 变大...你预计这会什么时候结束?

【讨论】:

  • 谢谢伙计,我似乎总是做这样的事情,除了通常我能找到它。谢谢!
【解决方案2】:

如果j 大于 a.length 开头(可能是),那么你的无限循环就存在了。

while(j >= a.length)
            {
                arr[i] = a[j];
                j++;
                i++;
            }

【讨论】:

    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 2016-08-31
    • 2016-04-14
    • 1970-01-01
    • 2016-07-15
    • 2020-07-16
    • 2018-05-02
    • 1970-01-01
    相关资源
    最近更新 更多