Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Arrays_Sorting - Fatal编程技术网

Java 使用比较器进行快速排序

Java 使用比较器进行快速排序,java,arrays,sorting,Java,Arrays,Sorting,我正在进行一个项目,用以下临界值对一系列学生对象进行排序: 1.分类等级 2.如果成绩相等,则按学生编号排序 现在我使用Arrays.Sort(T[]a,Comparator c)方法实现了这一点。 由于我认为这种排序方法太慢,所以我想使用快速排序 我得到了以下代码: public static void quickSort(Student[] arr, int low, int high) { if (arr == null || arr.length == 0) {

我正在进行一个项目,用以下临界值对一系列学生对象进行排序:

1.分类等级

2.如果成绩相等,则按学生编号排序

现在我使用Arrays.Sort(T[]a,Comparator c)方法实现了这一点。
由于我认为这种排序方法太慢,所以我想使用快速排序

我得到了以下代码:

public static void quickSort(Student[] arr, int low, int high) {
    if (arr == null || arr.length == 0) {
        return;
    }
    if (low >= high) {
        return;
    }
    // pick the pivot
    int middle = low + (high - low) / 2;
    Student pivot = arr[middle];
    // make left < pivot and right > pivot
    int i = low, j = high;
    while (i <= j) {
        while (arr[i].getCijfer() < pivot.getCijfer()) {
            i++;
        }
        while (arr[j].getCijfer() > pivot.getCijfer()) {
            j--;
        }
        if (i <= j) {
            Student temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
    }
    // recursively sort two sub parts
    if (low < j) {
        quickSort(arr, low, j);
    }
    if (high > i) {
        quickSort(arr, i, high);
    }
}
公共静态无效快速排序(学生[]arr,整型低,整型高){
如果(arr==null | | arr.length==0){
返回;
}
如果(低>=高){
返回;
}
//选择支点
int middle=低+(高-低)/2;
学生支点=arr[中间];
//使左<枢轴和右>枢轴
int i=低,j=高;
而(i pivot.getCijfer()){
j--;
}
如果(i){
快速排序(arr、i、高);
}
}
更新比较器代码:

private static Comparator<Student> gradeComparator = new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
        int compareTo = 0;
        if (o1.cijfer > o2.cijfer) {
            compareTo = -1;
        } else {
            if (o1.cijfer < o2.cijfer) {
                compareTo = 1;
            } else {
                // als Studenten Grade gelijk, vergelijk op studenten Ldap
                if (o1.cijfer == o2.cijfer) {
                    if (o1.studentnummer > o2.studentnummer) {
                        compareTo = -1;
                    } else {
                        compareTo = 1;
                    }
                }
            }
        }
        return compareTo;
    }
};
private static Comparator gradeComparator=new Comparator(){
@凌驾
公共整数比较(学生o1,学生o2){
int compareTo=0;
如果(o1.cijfer>o2.cijfer){
与之相比=-1;
}否则{
if(o1.cijfero2.studentnummer){
与之相比=-1;
}否则{
比较=1;
}
}
}
}
返回比较;
}
};
这将按等级(cijfer)对数组进行排序,但我仍然无法确定第二个排序标准的位置。请帮帮我


亲切问候

您需要将第二个标准放在您比较两个
学生
实例的任何地方,例如

if (arr[i].getCijfer() < pivot.getCijfer()
    || (arr[i].getCijfer() == pivot.getCijfer()
        && arr[i].getStudentNumber() < pivot.getStudentNumber()))

您需要将第二个标准放在比较两个
Student
实例的任何地方,例如

if (arr[i].getCijfer() < pivot.getCijfer()
    || (arr[i].getCijfer() == pivot.getCijfer()
        && arr[i].getStudentNumber() < pivot.getStudentNumber()))

这个表达式:
arr[i].getCijfer()
和这个:
arr[j].getCijfer()>pivot.getCijfer()
是问题的根源。您需要将它们提取到一个返回整数的函数中,实现如下:
return integer.compare(a.getCijfer(),b.getCijfer())

但随后您会注意到,这只是一个比较器函数,因此您可以继续修改它,使其与使用比较器时的工作方式完全相同

这解决了你的问题

但是,请注意以下几点:

  • 您认为
    Arrays.sort()
    会比某些快速排序慢,这是完全没有根据的,很可能是错误的

  • 你认为你可以做一个自酿的快速排序,它比array.sort()的性能更好,这很可能是错误的

  • 如果你不知道如何让自制的快速排序按你想要的方式排序,你必须询问stackoverflow,这没有什么错,但是很明显,排序是一个比你的教授期望你的要高级得多的主题


  • 这个表达式:
    arr[i].getCijfer()
    和这个:
    arr[j].getCijfer()>pivot.getCijfer()
    是问题的根源。您需要将它们提取到一个返回整数的函数中,实现如下:
    return integer.compare(a.getCijfer(),b.getCijfer())

    但随后您会注意到,这只是一个比较器函数,因此您可以继续修改它,使其与使用比较器时的工作方式完全相同

    这解决了你的问题

    但是,请注意以下几点:

  • 您认为
    Arrays.sort()
    会比某些快速排序慢,这是完全没有根据的,很可能是错误的

  • 你认为你可以做一个自酿的快速排序,它比array.sort()的性能更好,这很可能是错误的

  • 如果你不知道如何让自制的快速排序按你想要的方式排序,你必须询问stackoverflow,这没有什么错,但是很明显,排序是一个比你的教授期望你的要高级得多的主题


  • “既然我认为这种排序方法是慢”慢到什么程度?你认为它应该有多快?我想说的是,如果a)您正在对大量数据进行排序,那么速度会很慢;b) 您的比较器需要做大量的工作来比较元素。你能发布你的比较器代码吗?“因为我认为这种排序方法会变慢”有多慢?你认为它应该有多快?我想说的是,如果a)您正在对大量数据进行排序,那么速度会很慢;b) 您的比较器需要做大量的工作来比较元素。你能发布你的比较器代码吗?
    数组使用的排序在最好的情况下实际上比快速排序快,在其他情况下也同样有效。正如Mike所建议的,这听起来像是过早的优化。除非你有数以百万计的学生要排序,否则我怀疑内置的
    排序
    和你的自定义排序之间会有可测量的性能差异。好吧,我假设错的更快,但是我如何添加第二个排序标准分发解决学生作业的实际代码在这里通常是不受欢迎的。我写了总体思路,我想你应该知道如何在细节中体现出来就足够了。如果你不知道如何处理这些信息,如果这些信息不能帮助你真正学会如何做作业,那么你可能会失败!当你说“我使用Arrays.Sort(T[]a,Comparator c)方法工作时,你说的是实话吗?”?如果是,那么您就知道该怎么做了。
    Arrays.sort所使用的排序在最好的情况下实际上比快速排序快,并且执行效果相同
    
    class MyComparator implements Comparator<Student> {
      @Override int compare(Student a, Student b) {
        if (a.getCijfer() != b.getCijfer()) {
          return // Some comparison of a.getCijfer() and b.getCijfer()
        }
        // Somehow compare student number.
      }
    }