【问题标题】:Sorting names alphabetically with Merge Sort (recursive)使用合并排序(递归)按字母顺序对名称进行排序
【发布时间】:2014-04-08 00:15:28
【问题描述】:

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

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++;
                 }
            }
    }
}

我的输出是:

 before: [Ryan, Kelly, Alex, Kyle, Riley]
 after: [Alex, Kyle, Riley, Kelly, Ryan]

我哪里做错了?我该如何解决这个问题?

【问题讨论】:

  • 你为什么要传递三个数组?
  • 一个代表左边,一个代表右边,“a”就是全部
  • 您可以使用左右作为索引,因为您已经传递了数组结果
  • 所以我没有正确使用“左”和“右”?
  • 我认为 Amir 的意思是您可以使用与原始数组长度相同的单个辅助数组进行整个排序。我不认为像您在这里创建额外的子数组会影响比较次数,但它会将所需的额外空间从 O(n) 增加到 O(n lg n)。

标签: java mergesort alphabetical-sort


【解决方案1】:

您在以下行中有错误。

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

数组right 的索引应该是i2 而不是i1

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2011-10-13
    • 2014-01-14
    • 2019-06-25
    • 2011-08-29
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多