使用归并排序对姓名进行排序

6

我有问题在重复字符串排序上,以下是我的代码..

我成功排序了第一个数组,但在第二个数组(含有重复字符串)中,输出似乎没有按顺序排列。请帮我追踪一下代码哪里出错了。

import java.util.*;

public class NewClass {
    public static void main(String[] args) {
        String[] ClassOne = { "Kring", "Panda", "Soliel", "Darryl", "Chan", "Matang", "Jollibee.", "Inasal" };
        String[] ClassTwo = { "Minnie", "Kitty", "Madonna", "Miley", "Zoom-zoom", "Cristine", "Bubbles", "Ara", "Rose", "Maria" };
        String[] names = new String[ClassOne.length + ClassTwo.length];

        mergeSort(ClassOne);
        mergeSort(ClassTwo);

        merge(names, ClassOne, ClassTwo);

        mergeSort(names);
        //Arrays.sort(names);

        for (String ClassThree : names) {
            System.out.println(ClassThree);
        }
    }

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

            for (int i = 0; i < left.length; i++) {
                left[i] = names[i];
            }

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

            mergeSort(left);
            mergeSort(right);
            merge(names, left, right);
        }
    }

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

以下是输出结果:

Ara
Chan
Cristine
Bubbles
Jollibee.
Inasal
Kring
Madonna
Matang
Miley
Minnie
Kitty
Panda
Rose
Maria
Soliel
Darryl
Zoom-zoom

...


我没有看到重复的字符串。 - Christian Tapia
我是指相同的首字母,(玛丽亚,麦当娜,麦莉...) - jarnthrax
你可以使用 Arrays.sort 方法,它使用归并排序。 - Anirudha
是的,但我只想留在自己的函数中... - jarnthrax
3个回答

7

更改

if (names.length > 2) {

使用

if (names.length >= 2) {

输出

Ara
Bubbles
Chan
Cristine
Darryl
Inasal
Jollibee.
Kitty
Kring
Madonna
Maria
Matang
Miley
Minnie
Panda
Rose
Soliel
Zoom-zoom

1

只需更改此内容:

if (names.length > 2)

if (names.length > 1)

mergeSort 递归地将数组拆分成两半,然后合并它们并返回调用链。当传递给 mergeSort 的数组长度 <= 1 时,它认为数组已排序,这被称为基本情况


0
为什么不将这两个数组(String ClassOne 和 ClassTwo)连接成一个数组,然后对其进行归并排序呢?在我看来,你的方法使程序更加模糊。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接