比较器在内部如何工作?

How does comparator works internally?

这对你来说可能听起来微不足道,但我很难想象比较器/array.sort。我们如何仅使用 2 个参数对整个数组进行排序?它在内部是如何运作的?

例如-输入-[5,3,2,6,8,10,1],输出-[1,2,3,5,6,8,10] 它在内部使用哪种算法?它首先比较哪两个对象? (5 比 3?)接下来的两个对象是什么? (5 比 2?)或(3 比 2)?

public static void main(String[] args) {
         Integer[] tring = new Integer[]{5,3,2,6,8,10,1};
       lol(tring);
       for(int i=0;i<tring.length;i++){
       System.out.println(tring[i]);
       }
    }
    
    public static void lol(Integer[] args) {
      Arrays.sort(args,(h1,h2)->h1-h2);
    }

比较器使用一种称为 TimSort

的排序

我个人觉得没有资格解释 timsort 算法,但我相信你可以在 google.

上找到很多解释

对于你问题的第二部分,比较器使用你的两个增强的方式是确定任何两个给定值的顺序应该是什么顺序。

所以,例如,如果你想对 [6,4] 进行排序,比较器将使用你的函数 a-b,然后插入数字 6 和 4 并得到 2,因为 2 是正数,所以排序知道6 需要在 4 之后。这将导致 [4,6].

你可以像这样想象这个过程。

Integer[] tring = new Integer[]  {5, 3, 2, 6, 8, 10, 1};
Comparator<Integer> comparator = (a, b) -> {
    System.out.println(Arrays.toString(tring) + " comparing " + a + " and " + b);
    return a.compareTo(b);
};
Arrays.sort(tring, comparator);
System.out.println(Arrays.toString(tring));

结果:

[5, 3, 2, 6, 8, 10, 1] comparing 3 and 5
[5, 3, 2, 6, 8, 10, 1] comparing 2 and 3
[5, 3, 2, 6, 8, 10, 1] comparing 6 and 2
[2, 3, 5, 6, 8, 10, 1] comparing 6 and 3
[2, 3, 5, 6, 8, 10, 1] comparing 6 and 5
[2, 3, 5, 6, 8, 10, 1] comparing 8 and 5
[2, 3, 5, 6, 8, 10, 1] comparing 8 and 6
[2, 3, 5, 6, 8, 10, 1] comparing 10 and 5
[2, 3, 5, 6, 8, 10, 1] comparing 10 and 8
[2, 3, 5, 6, 8, 10, 1] comparing 1 and 6
[2, 3, 5, 6, 8, 10, 1] comparing 1 and 3
[2, 3, 5, 6, 8, 10, 1] comparing 1 and 2
[1, 2, 3, 5, 6, 8, 10]