Quicksort与比较器

时间:2015-11-24 16:41:54

标签: java arrays sorting

我正在研究使用以下标准对Student对象数组进行排序的项目:

1.Sort成绩

2.如果成绩相同,请在StudentNumber上排序。

现在我使用Arrays.Sort(T [] a,Comparator<> c)方法工作了。 因为我认为这种排序方法很慢,我想使用Quicksort。

我得到了以下代码:

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

更新比较器代码:

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

这对Grades(cijfer)上的数组进行排序,但我仍然坚持在第二个排序标准的位置。请帮帮我!

亲切的问候

2 个答案:

答案 0 :(得分:3)

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

但是你会注意到这只是一个比较器函数,所以你可以继续修改它,使其与你使用Arrays.sort()比较器时的工作完全一样。

这解决了你的问题。

但是,请注意以下事项:

  1. 您怀疑Arrays.sort()会比某些快速排序慢一点是完全没有根据的,很可能是假的。

  2. 您认为自己可以做一个表现优于Arrays.sort()的自制快餐,很可能是假的。

  3. 如果你不知道如何让自制的快速排序按照你想要的方式排序,你必须要求stackoverflow,这没有什么不妥,但显然,排序是一个比你教授对你的期望更高级的话题。

答案 1 :(得分:0)

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

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

但是,在此处添加多个条件并不方便,因此您最好介绍一种比较方法:

if (compare(arr[i], pivot) < 0)

然后将比较逻辑推入该方法,以便根据arr[i]是否小于,等于或大于pivot返回一些数字。

请注意,这基本上是Comparator提供的内容:

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.
  }
}