合并排序递归麻烦

问题描述

我一直在尝试进行合并排序,但合并部分却减少了,这只是递归拆分,这给我带来了一些麻烦。左列表和右列表将分别进行合并和排序,并且不会在每次递归遍历之间传递。我不确定递归在做什么或在不取消整个除法的情况下如何解决它。

public static int[] mergeSort(int[] x)
{
    divide(x);
    return sorted;
}

public static void divide(int[] x)
{
    int midP;
    if((x.length/2f) == 1.5f) //the left side of the list will always be larger
        midP = 2;
    else 
        midP = x.length/2;

    if(midP == 0) //if the list contains one number end
        return;

    System.out.println("mid: " + midP);

    int[] left = new int[midP];
    int[] right = new int[x.length - midP];

    for(int i = 0; i < midP; i++) //fills the left list
        left[i] = x[i];

    for(int i = midP; i < x.length; i++) //fills the right list
        right[i-midP] = x[i];

    divide(left);
    divide(right);

    sorted = merge(left,right);
}

public static int[] merge(int[] x,int[] y)
{
    int[] mergedList = new int[x.length + y.length];

    int counter = 0,xCounter = 0,yCounter = 0,high = 0;

    while(xCounter < x.length && yCounter < y.length)
    {
        printArray(x);
        printArray(y);
        System.out.println("checking: " + x[xCounter] + " " + y[yCounter]);
        
        if(x[xCounter] < y[yCounter])
        {
            mergedList[counter] = x[xCounter];
            high = y[yCounter];
            if(xCounter != x.length)
                xCounter++;
        }
        else
        {
            mergedList[counter] = y[yCounter];
            
            high = x[xCounter];
            
            if(yCounter != y.length)
                yCounter++;
        }
        counter++;
    }
    mergedList[counter] = high;
    return mergedList;
}

public static void printArray(int[] x)
{
    System.out.print("list: ");
    for(int i = 0; i < x.length; i++)
        System.out.print(x[i] + " ");
    System.out.println();
}

解决方法

在使用递归方法时,在这种情况下,使用静态变量或实例变量(例如sorted)非常棘手。发生的事情是sorted在递归调用上被设置和重置,并且可能很难预测在任何给定时间的价值。如果仅使用局部变量,则递归函数更易于理解。因此,更改您的divide函数,使其返回已排序的数组,并使用递归调用的返回值:

public static int[] divide(int[] x) {
    ... your existing divide logic ...

    int[] leftSorted = divide(left);
    int[] rightSorted = divide(right);

    return merge(leftSorted,rightSorted);
}

别忘了还要更改主入口点:

public static int[] mergeSort(int[] x) {
    return divide(x);
}

您似乎仍然在merge方法中发现错误:

    int[] x = {5,4,1,2,3};
    int[] sorted = mergeSort(x);

得出1 2 3 4 0

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...