当前位置: 首页 > 知识库问答 >
问题:

你能帮我使用ArrayList获得正确的MergeSort输出吗

岑鸣
2023-03-14

我是合并排序的新手,我能够使用整数数组int[]解决合并排序,但是每当我尝试使用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

共有1个答案

汝楷
2023-03-14

由于您使用初始大小分配临时数组,因此您应该使用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);
    }
}
 类似资料:
  • 嗨,伙计们,我的作业真的需要帮助。我试着做它,但是我不能解决它。 起始板: 期望结果: 然而,每次执行时,每当有赢家时,我总是得到以下信息: 最后,如何计算获胜次数最多的玩家的胜率? 限制: > < li> 您必须对井字游戏棋盘使用2D阵列。(我知道我没有使用2D数组,因为我不知道如何让编译器接受来自2D数组的1-9个输入。) 不能对此问题使用类。 如果愿意,可以使用静态方法。

  • 我是用aws java lambda cloud watch实现log4j2的新手。我需要自定义日志而不是云监控日志。我上传了一个csv的大尺寸记录使用步骤功能。因此,内置的cloud watch会反复记录相同的内容。所以我计划在java lambda中添加log4j2。为此,我在pom中添加了以下依赖项。xml 然后在src/main/资源下添加log4j2.xml。log4j2.xml就像下面

  • 问题内容: 当使用Express for Node.js时,我注意到它输出的HTML代码没有换行符或制表符。尽管下载可能更有效,但在开发过程中可读性不强。 如何获得Express以输出格式正确的HTML? 问题答案: 在您的主要位置或所在位置: 快递4.x 快递3.x 快递2.x 我输入漂亮的字样是因为您希望通过使用“丑陋”来提高效率。在生产中进行部署时,请确保设置环境变量。可以使用您在的“脚本”

  • 我正在进行代码挑战: 问题描述 给定2个整数x和n,您必须计算x的n次方,模10^9 7,即计算(x^n)%(10^9 7)。 换句话说,你必须找到当x提高到n的幂时的值,然后用10^9 7取模。 当a除以b时,a%b表示余数。例如,5%3=2,当我们将5除以3时,2是余数。 注意10^9也表示为1e9。 输入格式一行输入,包含两个空格分隔的整数x和n。 输出格式打印所需的答案。 样本输入1 10

  • 我写了一段代码,对给定的输入进行排序,但在返回排序后的输入后,它将始终返回相同的输出。我正在使用创建控制台应用程序。Visual Studio中的NET 5.0(当前版本)。 当我输入“Car-Apple-Banana”时,它会按单词排序。排序() 之后,我打印出原始输入,但它似乎也被排序。我不知道为什么,因为我从不分类。 当输入为:“汽车苹果香蕉” 我现在得到的输出是: 苹果香蕉车 苹果香蕉车

  • 我正在使用python与mysql交互,当我从mysql访问列时,我得到如下输出: [('some','t5vd._kz'),('something','anything')] 我希望它是: 一些,t5vd._kz 一些,任何东西 我的代码: