Java 和 Python 归并排序

标签 java mergesort

我是 Java 新手,我一直在尝试进行合并排序,就像我在 Python 中所做的那样。 这就是我在 Python 中的做法:

def merge_sort(a):
    length = len(a)
    if length > 1:
        left = a[: len(a) // 2]
        right = a[len(a) // 2 :]

        merge_sort(left)
        merge_sort(right)

        merge(a, left, right)


def merge(a, left, right):
    length = len(a)
    left_half = len(left)
    right_half = len(right)
    i1, i2 = 0, 0
    for i in range(length):
        if i2 >= right_half or (i1 < left_half and left[i1] < right[i2]):
            a[i] = left[i1]
            i1 += 1
        else:
            a[i] = right[i2]
            i2 += 1

这是我的 Java 代码,它返回索引错误。

import java.util.Arrays;

public class Merge_sort1 {

    public static void main(String[] args) {

        int[] a = {5, 3, 0, 1, 9, 6, 7, 4, 8, 2};
        System.out.println("Array before sorting");
        System.out.println(Arrays.toString(a));

        mergeSort(a);

        System.out.println("Array after sorting");
        System.out.println(Arrays.toString(a));
    }

    public static void mergeSort(int[] a) {
        if (a.length > 1) {
            int mid = a.length / 2;
            int[] left = Arrays.copyOfRange(a, 0, mid - 1);
            int[] right = Arrays.copyOfRange(a, mid, a.length - 1);

            mergeSort(left);
            mergeSort(right);

            merge(a, left, right);
        }   
    }

    public static void merge(int[] a, int[] l, int[] r) {
        int i1 = 0;
        int i2 = 0;
        for(int i = 0; i < a.length; i++) {
            if(i2 >= r.length || (i1 < l.length && l[i1] < r[i2])) {
                a[i] = l[i1];
                i1++;
            a[i] = r[i2];
            i2++;
                }
            }
        }
    }



如果有人能向我解释我做错了什么以及解决问题的最佳方法,我将非常感激。 谢谢

最佳答案

copyOfRange调用错误;请注意,第二个参数是排他性的而不是包容性的。这意味着该方法的第二个参数减1是最后一个要复制的元素。因此,例如,当调用 copyOfRange(a, b, c) 时,数组 a 会从索引 b 复制到 c - 1 ,而不是c

此外,merge 中的 if 语句应该是 if-else 语句(您忘记了 else部分)。

这是修复后的代码,具有正确的输出:

import java.util.Arrays;

public class Main {

    public static void main(final String[] args) {

        int[] a = {5, 3, 0, 1, 9, 6, 7, 4, 8, 2};
        System.out.println("Array before sorting");
        System.out.println(Arrays.toString(a));

        mergeSort(a);

        System.out.println("Array after sorting");
        System.out.println(Arrays.toString(a));
    }

    public static void mergeSort(int[] a) {
        if (a.length > 1) {
            int mid = a.length / 2;
            int[] left = Arrays.copyOfRange(a, 0, mid);
            int[] right = Arrays.copyOfRange(a, mid, a.length);

            mergeSort(left);
            mergeSort(right);

            merge(a, left, right);
        }   
    }

    public static void merge(int[] a, int[] l, int[] r) {
        int i1 = 0;
        int i2 = 0;
        for(int i = 0; i < a.length; i++) {
            if(i2 >= r.length || (i1 < l.length && l[i1] < r[i2])) {
                a[i] = l[i1];
                i1++;
            }
            else {
                a[i] = r[i2];
                i2++;
            }
        }
    }
}

关于Java 和 Python 归并排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59447841/

相关文章:

java - 使用 Genson 将映射转换为键值对

合并排序后无法打印出双数数组

scala 参数化合并排序 - 令人困惑的错误消息

arrays - 使用 typescript 计算数组中的反转

java - 当 SELECT 查询在插入查询之前时,getGeneratedKeys() 不起作用

java - 使用SD卡作为输入流(图像)android而不是内部存储器

java - 从不同线程访问数据时丢失对象引用

java - 安卓工作室 : NoClassDefFoundError exception on runtime with Java Library Module

c++ - MergeSort 打印出奇怪的数字!无法在调试中跟踪

python - 列表在合并排序的递归循环中创建后返回无类型