Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_String_Quicksort - Fatal编程技术网

Java字符串快速排序偶尔有效?

Java字符串快速排序偶尔有效?,java,string,quicksort,Java,String,Quicksort,我正在做一项我在这里看到的作业,但在我复习完之后,我似乎仍然看不出我做错了什么。我对字符串数组进行快速排序的代码在大多数情况下似乎都有效。但是如果我多次运行它,它有时会产生错误的输出。如果您能给我一些建议,我将不胜感激 import java.util.Random; public class QuickSortStrings { static String[] strings; public static void main(String[] args) {

我正在做一项我在这里看到的作业,但在我复习完之后,我似乎仍然看不出我做错了什么。我对字符串数组进行快速排序的代码在大多数情况下似乎都有效。但是如果我多次运行它,它有时会产生错误的输出。如果您能给我一些建议,我将不胜感激

import java.util.Random;
public class QuickSortStrings {

    static String[] strings;

    public static void main(String[] args) {

        strings = new String[args.length];

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

        qsort(0, strings.length-1);

        System.out.print("The array, quicksorted: ");
        for (int i = 0; i < strings.length; i++)
        {
            System.out.print(strings[i] + " ");
        }
        System.out.println("\n");
    }

    static void qsort(int low, int high) {
        int i = low, j = high;

        // Get the pivot element
        Random r = new Random();
        int pivot = r.nextInt(high-low+1)+low;

        // Divide into two lists
        while (i <= j) {

          while (strings[i].compareTo(strings[pivot]) < 0) i++;

          while (strings[j].compareTo(strings[pivot]) > 0) j--;

          if (i <= j) {
            exchange(i, j);
            i++;
            j--;
          }
        }

        // Recursion
        if (low < j) qsort(low, j);
        if (i < high) qsort(i, high);
      }

    static void exchange(int i, int j) {
        String temp = strings[i];
        strings[i] = strings[j];
        strings[j] = temp;
    }
}
import java.util.Random;
公共类QuickSortString{
静态字符串[]字符串;
公共静态void main(字符串[]args){
strings=新字符串[args.length];
对于(int i=0;i
  • 添加一个返回布尔值的函数,以检查数组是否已排序
  • 在每次迭代时调用它,并且只有当它失败时(您发现一个输入数据数组不工作),您才打印或序列化相关数据
  • 现在,使用这些数据作为输入启动调试器,并希望能够跟踪bug

  • 排序的每次迭代都会减少可排序范围。基本上,这是一种分而治之的算法

    pivot
    查找指定范围的“中点”

    问题是,您正在将
    随机化,因此每次运行排序时,它都会比较一些随机部分,可能包括您已经排序的部分

    因此,与其使用

    int pivot = r.nextInt(high-low+1)+low;
    
    你应该使用

    int pivot = low + (high - low) / 2;
    
    例如

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Random;
    
    public class QuickSort {
    
        static String[] strings;
    
        public static void main(String[] args) {
    
            List<String> values = new ArrayList<>(26);
            for (int index = 0; index < 26; index++) {
                values.add(new String(new char[]{(char)(65 + index)}));
            }
            Collections.shuffle(values);
    
            strings = values.toArray(new String[values.size()]);
            System.out.println("Before");
            for (int i = 0; i < strings.length; i++) {
                System.out.print(strings[i] + " ");
            }
            System.out.println("");
    
            qsort(0, strings.length - 1);
    
            System.out.println("The array, quicksorted: ");
            for (int i = 0; i < strings.length; i++) {
                System.out.print(strings[i] + " ");
            }
            System.out.println("\n");
        }
    
        static void qsort(int low, int high) {
            int i = low, j = high;
    
            // Get the pivot element
            int pivot = low + (high - low) / 2;
            String value = strings[pivot];
    
            // Divide into two lists
            while (i <= j) {
    
                while (strings[i].compareTo(value) < 0) {
                    i++;
                }
    
                while (strings[j].compareTo(value) > 0) {
                    j--;
                }
    
                if (i <= j) {
                    exchange(i, j);
                    i++;
                    j--;
                }
            }
    
            // Recursion
            if (low < j) {
                qsort(low, j);
            }
            if (i < high) {
                qsort(i, high);
            }
        }
    
        static void exchange(int i, int j) {
            String temp = strings[i];
            strings[i] = strings[j];
            strings[j] = temp;
        }
    
    }
    

    注意-不要强调使用
    列表
    ,我只是生成了一些随机的
    字符串
    s;)

    此代码是否会在同一组输入字符串上产生错误的输出,即提供相同的输入或使用不同的输入…如果使用不同的输入,您可以发布哪一组错误的结果为什么您使用的是
    随机
    透视?您好。要求人们发现代码中的错误不是特别有效。您应该使用e调试器(或添加打印语句)通过跟踪程序的进度,并将其与预期发生的情况进行比较,来隔离问题。一旦两种情况出现分歧,您就发现了问题。(然后,如果必要,您应该构造一个。)你很早就完成了。在你增加i和减少j之后你会做什么?通常你应该交换元素[i]和[j]如果我@MadProgrammer随机数据透视有什么问题吗?我认为它在某些情况下很有用。我知道。问题是我的任务是使用随机数据透视。我的导师说这将确保最佳的平均处理时间。自从我将您共享的代码更改为随机数据透视后,这种情况一直在发生。谢谢。我最终这样做了仅此而已-添加了一个布尔函数进行检查,并添加了一个while语句调用快速排序,直到返回true。立即生效。
    Before
    N S B A F Z X J Q K V C L R W E H Y M U G I D P T O 
    The array, quicksorted: 
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
    
    Before
    G U P Q D A W T R M E O X J S C I V Y F H L B N Z K 
    The array, quicksorted: 
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
    
    Before
    D Z C B Q O K W X F V G R S A U P T H Y I E N L M J 
    The array, quicksorted: 
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
    
    Before
    Q K H B W N J V C Y U O R P G I F D Z E L S A X M T 
    The array, quicksorted: 
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
    
    Before
    R V P G E S C A H W X I T D Z B K Q F M U Y L J N O 
    The array, quicksorted: 
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
    
    Before
    L O T E U D H N P J V I Q C X S Z W A R F K G Y B M 
    The array, quicksorted: 
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
    
    Before
    I E J F U X P K R Q L S C O Y W G A Z B V M D H N T 
    The array, quicksorted: 
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
    
    Before
    X L K T W E V J N Y G H O Q I M C P A R B F S U Z D 
    The array, quicksorted: 
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
    
    Before
    U X N T K Q S V P F W C G Y O L A B E H J R D M Z I 
    The array, quicksorted: 
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
    
    Before
    A J Z C M Y O Q F L K D P S X W N T I B H E R U V G 
    The array, quicksorted: 
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z