Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用合并排序(递归)按字母顺序对名称进行排序_Java_Mergesort_Alphabetical Sort - Fatal编程技术网

Java 使用合并排序(递归)按字母顺序对名称进行排序

Java 使用合并排序(递归)按字母顺序对名称进行排序,java,mergesort,alphabetical-sort,Java,Mergesort,Alphabetical Sort,在移动到命令行并输入文件之前,我尝试按字母顺序对五个名称进行排序。但是我遇到了字母顺序的问题。 我的代码如下: import java.util.*; public class MergeSortLines { public static void main(String[] args) { String[] list = {"Ryan", "Kelly", "Alex", "Kyle", "Riley"}; System.out.println("be

在移动到命令行并输入文件之前,我尝试按字母顺序对五个名称进行排序。但是我遇到了字母顺序的问题。 我的代码如下:

import java.util.*;

public class MergeSortLines {
    public static void main(String[] args) {
        String[] list = {"Ryan", "Kelly", "Alex", "Kyle", "Riley"};
        System.out.println("before: " + Arrays.toString(list));
        mergeSort(list);
        System.out.println("after: " + Arrays.toString(list));
    }

    public static void mergeSort(String[] a) {
        if (a.length >= 2) {
            String[] left = new String[a.length / 2];
            String[] right = new String[a.length-a.length / 2];

            for (int i = 0; i < left.length; i++)
            {
                left[i] = a[i];
            }
            for (int i = 0; i < right.length; i++)
            {
                right[i] = a[i + a.length / 2];
            }

            mergeSort(left);
            mergeSort(right);

            merge(a, left, right);
        }
    }

    public static void merge(String[] result, String[] left, String[] right) {
        int i1 = 0;
        int i2 = 0;
        for (int i = 0; i < result.length; i++) {
            if (i2 >= right.length || (i1 < left.length &&
                                 left[i1].compareToIgnoreCase(right[i1])<0)) {
                      result[i] = left[i1];
                      i1++;
                 } else {
                      result[i] = right[i2];
                      i2++;
                 }
            }
    }
}

我哪里出错了?如何修复此问题?

下面一行中有一个错误

        if (i2 >= right.length || (i1 < left.length &&
                             left[i1].compareToIgnoreCase(right[i1])<0)) {

为什么要传递三个数组?一个用于左侧,一个用于右侧,而“a”是全部内容,您可以使用left和right作为索引,因为您已经传递了数组结果,所以我不使用“left”和“right”正确吗?我认为Amir的意思是,可以使用一个辅助数组,其长度与原始数组的长度相同,用于整个排序。我不认为像您这样创建额外的子数组会影响比较的数量,但它会将所需的额外空间从O(n)增加到O(n)。
        if (i2 >= right.length || (i1 < left.length &&
                             left[i1].compareToIgnoreCase(right[i1])<0)) {
        if (i2 >= right.length || (i1 < left.length &&
                             left[i1].compareToIgnoreCase(right[i2])<0)) {