Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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 - Fatal编程技术网

使用合并排序+;JAVA

使用合并排序+;JAVA,java,mergesort,Java,Mergesort,我试图使用合并排序按升序对字符串中的字符进行排序,但我不知道应该在哪里比较字符以对其进行排序。 这是我目前的方法: public static String mergeSort(String s) { String left = "", right = ""; if(s.length() <= 1) return s; int middle = s.length()/2;

我试图使用合并排序按升序对字符串中的字符进行排序,但我不知道应该在哪里比较字符以对其进行排序。 这是我目前的方法:

public static String mergeSort(String s)
    {
        String left = "",
               right = "";
        if(s.length() <= 1)
            return s;
        int middle = s.length()/2;
        for(int i = 0; i < middle; i++)
            left = left + s.charAt(i);
        for(int i = middle+1; i < s.length(); i++)
            right = right + s.charAt(i);
        left = mergeSort(left);
        right = mergeSort(right);
        return merge(left, right);
    }
公共静态字符串合并排序(字符串s)
{
字符串左=”,
右=”;

如果(s.length()您可以使用两个字符的减法。因此,如果您有两个字符
a
b
,并且:

  • a-b=0
    ,字符相等
  • a-b>0
    a
    更大
  • a-b<0
    b
    更大
这就是
Character.compareTo()
方法的实现方式

  • 不要在计算中使用
    String
    ,因为Java中的
    String
    是不可变的。您将创建数千个对象,这会降低实现速度。我建议改用
    char[]
  • 您可以在
    merge()
    子例程中进行实际比较。比较
    char
    的方法与比较例如
    int
    的方法相同,只需使用标准的
    运算符即可

  • 首先,我建议你阅读

    根据您的代码,有两件事需要建议

  • 两个字符的实际比较不是在
    mergeSort()
    中进行的,而是在
    merge()
    中进行的。请参阅维基百科的伪代码以了解如何编写它
  • 我不建议您构建一次读取一个字符的
    字符串对象。无需使用
    charAt()
    。而是使用
    String.substring()
    ()
  • 附加信息 使用此选项设置
    左侧
    右侧

    String left = s.substring(0, middle);
    String right = s.substring(middle);
    

    您可以将输入字符串转换为字符数组,并进行合并排序计算,如下所示:

    import java.util.Queue;
    import java.util.LinkedList;
    
    public class MergeSort {
    
        public static void sort(char[] chars, int low, int right) {
            if (low < right) {
                int middle = (low + right) / 2;
                sort(chars, low, middle);
                sort(chars, middle + 1, right);
                merge(chars, low, middle, right);
            }
        }
    
        public static void merge(char[] chars, int low, int middle, int right) {
            Queue<Character> queue1 = new LinkedList<Character>();
            Queue<Character> queue2 = new LinkedList<Character>();
    
            for (int i = low; i <= middle; i++) {
                queue1.add(chars[i]);
            } 
    
            for (int i = middle + 1; i <= right; i++) {
                queue2.add(chars[i]);
            }
    
            int i = low;
    
            while (!queue1.isEmpty() && !queue2.isEmpty()) {
                if (queue1.peek() <= queue2.peek()) {
                    chars[i++] = queue1.poll();
                } else {
                    chars[i++] = queue2.poll();
                }
            }
    
            while (!queue1.isEmpty()) {
                chars[i++] = queue1.poll();
            }
    
            while (!queue2.isEmpty()) {
                chars[i++] = queue2.poll();
            }
        }
    
        public static void sort(char[] chars) {
            sort(chars, 0, chars.length - 1);
        }
    
        public static void sort(String string) {
            sort(string.toCharArray());
        }
    
        public static void main(String[] args) {
            String string = "sarathkumarsivan";
            char[] chars = string.toCharArray();
    
            MergeSort.sort(chars);
    
            for (int i = 0; i < chars.length; i++) {
                if (i > 0) { System.out.print(", "); }
                System.out.print(chars[i]);
            }
        }
    }
    
    import java.util.Queue;
    导入java.util.LinkedList;
    公共类合并排序{
    公共静态无效排序(char[]chars,int-low,int-right){
    如果(低<右){
    中间整数=(低+右)/2;
    排序(字符、低、中);
    排序(字符,中间+1,右);
    合并(字符、低、中、右);
    }
    }
    公共静态无效合并(char[]chars,int low,int middle,int right){
    Queue queue1=新的LinkedList();
    Queue queue2=新的LinkedList();
    
    for(inti=low;i其中的
    merge()
    method?我还没有编写合并方法。我想我必须先完成这个。不是吗?你能告诉我应该在哪里比较字符吗?在这个方法中?确切在哪里?在for中?这应该在
    merge
    方法中。你已经实现了一个吗?如果是的话,如果你向我们展示代码会很有帮助。1.事实上,在给出的规范中,规定输出应该是一个字符串,并且应该进行排序(在这个方法中,而不是在合并方法中),因此您的意思是我将“left=left+s.charAt(I);”更改为“left=s.substring(I);”谢谢,在您告诉我您的其他信息之前,我做了同样的事情^^