调试Mergesort实现

时间:2012-07-09 20:31:11

标签: java algorithm sorting mergesort

好的,我知道这个问题不会显示研究工作,但我已经多次查看这段代码而且我无法弄清楚我做错了。我知道有许多Mergesort实现示例,但我想按照我的方式去做。感谢任何帮助。谢谢。

import java.util.Scanner;
public class MergeSort
{
    public static int[] mergeSort(int[] arr)
    {
        if (arr.length > 1)
        {
            int[] arr1 = splitLeft(arr);
            int[] arr2 = splitRight(arr);
            arr1 = mergeSort(arr1);
            arr2 = mergeSort(arr2);
            return merge(arr1, arr2);
        }
        else
            return arr;
    }

    public static int[] splitLeft(int[] arr)
    {
        int middle = arr.length / 2;
        int[] newarr = new int[middle];
        for (int i = 0; i < middle; i++)
            newarr[i] = arr[i];
        return newarr;
    }

    public static int[] splitRight(int[] arr)
    {
        int middle = arr.length / 2;
        int[] newarr = new int[arr.length - middle];
        for (int i = 0; i + middle < arr.length; i++)
            newarr[i] = arr[i + middle];
        return newarr;
    }

    public static int[] merge(int[] arr1, int[] arr2)
    {       
        int[] sorted = new int[arr1.length+arr2.length];

        int i1 = 0;
        int i2 = 0;
        int i = 0;

        while (i1 < arr1.length && i2 < arr2.length)
        {
            if (arr1[i1] < arr2[i2])
            {
                sorted[i] = arr1[i1];
                i1++;
            }

            else
            {
                sorted[i] = arr2[i2];
                i2++;
            }
        i++;
        }

        while (i1 < arr1.length) 
        {
            sorted[i] = arr1[i1];
            i1++;
            i++;
        }

        while (i2 < arr2.length) 
        {
            sorted[i] = arr1[i2];
            i2++;
            i++;
        }
        return sorted;
    }

    public static int getNum(int x)
    {
        int num = (int)(Math.random()*x + 1);
        return num;
    }

    public static void printArr(int[] arr)
    {
        System.out.println();
        for (int i = 0; i < arr.length; i++)
            System.out.println(arr[i]);
    }

    static Scanner reader = new Scanner(System.in);
    public static void main(String [ ] args)
    {
        int i;

        System.out.println("Type the length of the array");
        int n = reader.nextInt();

        System.out.println("Type the range of the random numbers generator");
        int range = reader.nextInt();

        int[]arr = new int[n];

        for (i = 0; i < n; i++)
            arr[i] = getNum(range);

        printArr(arr);

        int[] sorted = new int[n];
        sorted = mergeSort(arr);

        printArr(sorted);
    }
}

2 个答案:

答案 0 :(得分:2)

我认为问题出在你的splitRight函数中。请考虑以下代码:

for (int i = middle; i < arr.length; i++)
    newarr[i] = arr[i];

这会尝试将i元素从arr复制到i的{​​{1}}位置,但这是不正确的。例如,如果数组newarr包含十个元素,则您希望将arr的元素5复制到arr的位置0,将newArr的元素6复制到{的位置1 {1}}等等。

要解决此问题,请考虑尝试以下方法:

arr

希望这有帮助!

答案 1 :(得分:0)

当你这样做时

for (int i = middle; i < arr.length; i++)
            newarr[i] = arr[i];

你肯定会在原始数组中询问位置,同时在新数组中寻找它们(这恰好更短)。