【问题标题】:Can you help me get the right output for MergeSort using ArrayList你能帮我使用 ArrayList 获得 MergeSort 的正确输出吗
【发布时间】:2023-03-26 22:24:01
【问题描述】:

我是mergeSort 的新手,我能够使用整数数组int[] 来解决mergeSort,但是每当我尝试使用ArrayList 来实现它时,我似乎根本无法正确排序。我试图理解为什么会这样,以及使用相同的方法和变量名的实际解决方案是什么。

/* Java program for Merge Sort */
import java.util.ArrayList;
import java.util.Scanner;
class MergeSort
{
    // Merges two subarrays of arr[].
    // First subarray is arr[l..m]
    // Second subarray is arr[m+1..r]
    void merge(ArrayList<Integer> al, int beg, int mid, int end)
    {
        // Find sizes of two subarrays to be merged
        int ls = mid - beg + 1;
        int rs = end - mid;

        /* Create temp arrays */
        ArrayList lft = new ArrayList(ls);
        ArrayList rgt = new ArrayList(rs);

        /*Copy data to temp arrays*/
        for (int i = 0; i < ls; i++)
            lft.add(i, al.get(beg + i));
        for (int j = 0; j < rs; ++j)
            rgt.add(j, al.get(mid + 1 + j));

        /* Merge the temp arrays */

        // Initial indexes of first and second subarrays
        int li;
        int ri;
        li = 0;
        ri = 0;

        // Initial index of merged subarry array
        int mi = beg;
        while (li < ls && ri < rs) {
            if ((int)lft.get(li) <= (int)rgt.get(ri)) {
                al.set(mi, (int)lft.get(li));
                li++;
            } else {
                al.set(mi, (int)rgt.get(li));
                ri++;
            }
            mi++;
        }

        /* Copy remaining elements of L[] if any */
        while (li < ls) {
            al.add(mi, (int)lft.get(li));
            li++;
            mi++;
        }

        /* Copy remaining elements of R[] if any */
        while (ri < rs) {
            al.add(mi, (int)rgt.get(ri));
            ri++;
            mi++;
        }
    }

    // Main function that sorts arr[l..r] using
    // merge()
    void sort(ArrayList al, int beg, int end)
    {
        if (beg < end) {
            // Find the middle point
            int mid =beg+ (end-beg)/2;

            // Sort first and second halves
            sort(al, beg, mid);
            sort(al, mid + 1, end);

            // Merge the sorted halves
            merge(al, beg, mid, end);
        }
    }

    /* A utility function to print array of size n */
    static void printArray(ArrayList al)
    {
        int arSize = al.size();
        for (int i = 0; i < arSize; i++)
            System.out.print(al.get(i) + " ");
        System.out.println();
    }

    // Driver code
    public static void main(String args[])
    {
        ArrayList finArr = new ArrayList();
        finArr.add(11);
        finArr.add(12);
        finArr.add(10);
        finArr.add(6);
        finArr.add(1);
        System.out.println("Given Array");
        printArray(finArr);

        MergeSort ob = new MergeSort();
        ob.sort(finArr, 0, finArr.size() - 1);

        System.out.println("\nSorted array");
        printArray(finArr);
    }
}

以上代码的输出为:

Given Array
11 12 10 6 1

Sorted array
10 11 12 12 12 12 10 6 1

但是,我不明白为什么输出不是:

Sorted array
1 6 10 11 12

【问题讨论】:

  • 您应该致电.add,或从不致电.addaddset 之间不应混用。
  • 这里可以做什么?我应该在哪里编辑?我对此很陌生,至少可以说缺乏经验。
  • 这应该是一个简单的答案。最好是自己找出来。也许通过 debuggin 分析你的代码对你很有帮助。这是一般调试的一些技巧:codementor.io/@mattgoldspink/… 这是如何使用 IntelliJ IDE 进行调试 jetbrains.com/help/idea/… 当您使用另一个 IDE 时,您会发现许多关于如何使用此 IDE 进行调试的文章和视频。
  • @YugantBasnet:您可以通过点击分数下方的灰色复选标记来接受答案。

标签: java arrays loops arraylist mergesort


【解决方案1】:

由于您分配具有初始大小的临时数组,您应该使用lft.set()rgt.set() 来设置值而不是.add。同样,从临时数组中复制剩余元素时,请使用al.set() 而不是al.add()

这是修改后的版本:

/* Java program for Merge Sort */
import java.util.ArrayList;
import java.util.Scanner;
class MergeSort
{
    // Merges two subarrays of arr[].
    // First subarray is arr[l..m]
    // Second subarray is arr[m+1..r]
    void merge(ArrayList<Integer> al, int beg, int mid, int end)
    {
        // Find sizes of two subarrays to be merged
        int ls = mid - beg + 1;
        int rs = end - mid;

        /* Create temp arrays */
        ArrayList lft = new ArrayList<Integer>(ls);
        ArrayList rgt = new ArrayList<Integer>(rs);

        /* Copy data to temp arrays */
        for (int i = 0; i < ls; i++)
            lft.set(i, al.get(beg + i));
        for (int j = 0; j < rs; ++j)
            rgt.set(j, al.get(mid + 1 + j));

        /* Merge the temp arrays */

        // Initial indexes of first and second subarrays
        int li;
        int ri;
        li = 0;
        ri = 0;

        // Initial index of merged subarray array
        int mi = beg;
        while (li < ls && ri < rs) {
            if ((int)lft.get(li) <= (int)rgt.get(ri)) {
                al.set(mi, (int)lft.get(li));
                li++;
            } else {
                al.set(mi, (int)rgt.get(li));
                ri++;
            }
            mi++;
        }

        /* Copy remaining elements of L[] if any */
        while (li < ls) {
            al.set(mi, (int)lft.get(li));
            li++;
            mi++;
        }

        /* Copy remaining elements of R[] if any */
        while (ri < rs) {
            al.set(mi, (int)rgt.get(ri));
            ri++;
            mi++;
        }
    }

    // Main function that sorts arr[l..r] using
    // merge()
    void sort(ArrayList al, int beg, int end)
    {
        if (beg < end) {
            // Find the middle point
            int mid = beg + (end - beg) / 2;

            // Sort first and second halves
            sort(al, beg, mid);
            sort(al, mid + 1, end);

            // Merge the sorted halves
            merge(al, beg, mid, end);
        }
    }

    /* A utility function to print array of size n */
    static void printArray(ArrayList al)
    {
        int arSize = al.size();
        for (int i = 0; i < arSize; i++)
            System.out.print(al.get(i) + " ");
        System.out.println();
    }

    // Driver code
    public static void main(String args[])
    {
        ArrayList finArr = new ArrayList();
        finArr.add(11);
        finArr.add(12);
        finArr.add(10);
        finArr.add(6);
        finArr.add(1);
        System.out.println("Given Array");
        printArray(finArr);

        MergeSort ob = new MergeSort();
        ob.sort(finArr, 0, finArr.size() - 1);

        System.out.println("\nSorted array");
        printArray(finArr);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多