此合并排序的返回值如何工作?

时间:2016-04-23 21:48:24

标签: java return-value mergesort

在计算机科学课中,出现了这个合并排序的例子。即使“mergeSort()”函数没有返回任何内容,数组“array1”最终如何变化?我很困惑。我问老师,但他不确定。

其他人可以帮我吗?谢谢!

import java.util.Arrays;

public class MergeSort
{
    public static void main(String[] args)
    {
        int[] array1 = {5, 3, 4, 1, 6, 2};
        int[] array2 = {5, 6, 4, 8, 9, 7, 3, 1, 2};

        System.out.print("First array: ");
        System.out.println(Arrays.toString(array1));
        // System.out.print("Second array: ");
        // System.out.println(Arrays.toString(array2));
        System.out.println();

        // sort first array
        mergeSort(array1);
        // sort second array
        // mergeSort(array2);

        System.out.print("First array sorted: ");
        System.out.println(Arrays.toString(array1));
        // System.out.print("Second array sorted: ");
        // System.out.println(Arrays.toString(array2));
    }

    /*
     * Merge sort takes in an array and returns the same array, sorted.
     */
    public static void mergeSort(int[] arr) 
    {
        int[] temp = new int[arr.length];
        mergeSortHelper(arr, 0, arr.length - 1, temp);
    }

    public static void mergeSortHelper(int[] arr, int from, int to, int[] temp)
    {
        // If the array length is greater than 1
        if(to - from >= 1)
        {
            int mid = (from + to) / 2;
            mergeSortHelper(arr, from, mid, temp);
            mergeSortHelper(arr, mid + 1, to, temp);
            merge(arr, from, mid, to, temp);
            System.out.println(Arrays.toString(arr));
        }
    }

    public static void merge(int[] arr, int from, int mid, int to, int[] temp) 
    {
        int i = from;       // track left array position
        int j = mid + 1;    // track right array position
        int k = from;       // track temp position

        while(i <= mid && j <= to)
        {
            // If the element in the left subarray is less
            // than the element in the right subarray it 
            // is next in the merged list
            if(arr[i] < arr[j])
            {
                temp[k] = arr[i];
                i++;
            }
            else
            {
                temp[k] = arr[j];
                j++;
            }
            k++;
        }

        // We may have missed elements from either list
        while(i <= mid)
        {
            temp[k] = arr[i];
            i++;
            k++;
        }

        while(j <= to)
        {
            temp[k] = arr[j];
            j++;
            k++;
        }

        // Copy over from temp to elements
        for(k = from; k <= to; k++)
        {
            arr[k] = temp[k];
        }

    }
}

2 个答案:

答案 0 :(得分:0)

mergeSort()调用mergeSortHelper(),调用merge()

merge()更改了arr[k] = temp[k];

行上的数组

因此,mergeSort()实际上会修改数组,尽管它通过调用修改数组的其他方法来实现。

答案 1 :(得分:0)

对于迟到的回复感到抱歉,我没有看到关于这篇文章的任何电子邮件,所以我认为没有人回复。

我应该澄清一下:我的老师应该教我们Java,他做了一些,但他也喜欢把重点放在有关编程的新闻上,比如“最近发现了一个安全漏洞苹果”等等。他是也很悠闲,不知道如何保持班级排队,所以基本上我班上的每一个人,但我(我是唯一对课堂感兴趣的人)在课堂上观看视频和玩游戏,从不做任何事家庭作业。我的老师非常悠闲,他没有惩罚任何人,所以我最终成为唯一一个对java有所了解的人。

他让我们为AP Java的代码HS做了一些事情,但我是唯一一个真正按时完成它的人,所以我无所事事,但在我的老师等待我的同时,在网站上查看不同的编码技术同学为几个班级做点什么。当我环顾四周时,我在mergesort上看到了一个小部分,并通过代码HS给出了这个例子。那是我问老师的时候。我猜他从未接受过非常多的Java教学,他不知道答案。哎呀,他甚至不记得抽象课是什么。

他是我学校唯一的老师。我认为明年他会变得更加严格,因为据我所知,他的低级计算机科学课实际上已经做了些什么。也许我已经给了他一点希望,那里有学生真正关心计算机科学。