java - 这是合并排序的稳定实现吗

标签 java mergesort

我想知道 MergeSort 的这种实现是否稳定?更具体地说,如果有两个元素的 compareTo 值为 0,那么它们将保持与原始数组相同的顺序。

提前致谢。

import java.lang.reflect.Array;

public class MergeSort {

    public static <E extends Comparable<E>> E[] sort(E[] original) {
        if (original.length < 2)
            return original;

        E[] left = (E[]) Array.newInstance(original.getClass().getComponentType(), original.length / 2);
        for (int i = 0; i < left.length; i++)
            left[i] = original[i];

        E[] right = (E[]) Array.newInstance(original.getClass().getComponentType(), original.length - left.length);
        for (int i = 0; i < right.length; i++)
            right[i] = original[left.length + i];

        left = sort(left);
        right = sort(right);

        return merge(left, right);
    }

    static <E extends Comparable<E>> E[] merge(E[] left, E[] right) {
        E[] out = (E[]) Array.newInstance(left.getClass().getComponentType(), left.length + right.length);

        int i = 0, j = 0, k = 0;

        // Traverse both array
        while (i < left.length && j < right.length) {
            if (left[i].compareTo(right[j]) <= 0)
                out[k++] = left[i++];
            else
                out[k++] = right[j++];
        }

        // Store remaining elements of first array
        while (i < left.length)
            out[k++] = left[i++];

        // Store remaining elements of second array
        while (j < right.length)
            out[k++] = right[j++];
        //#)

        return out;
    }
}

最佳答案

正如代码中所说:

    // Traverse both array
    while (i < left.length && j < right.length) {
        if (left[i].compareTo(right[j]) <= 0)
            out[k++] = left[i++];
        else
            out[k++] = right[j++];
    }

这里重要的部分是<= 0 。 如果两个值相等,compareTo 返回 0 。因此,如果比较的值相等,则采用左侧数组中的值,这意味着相等的值将保持相同的顺序

关于java - 这是合并排序的稳定实现吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58969320/

相关文章:

java - TitledPane 中的焦点遍历策略

java - 将 Python JSON API 移植到 Java (GWT)

algorithm - 如果我们将合并排序中的数组拆分为 4 个部分会怎样?还是八个部分?

python - 解释了两种不同合并排序实现之间的比较

algorithm - 为什么快速排序比合并排序更好?

c++ - 递归合并排序算法实现

java - 将值 String[] 传递给 String[] 值

java - 使用 selenium wait 刷新页面后,当 webelement 的状态从初始值 "xxx"更改为更改值 "yyy"时,如何处理?

java - 使用 java.util.zip.* 解压缩使用 Apache POI 创建的 xlsx blob 时失败

java - 多线程排序算法