Java | 快排sort | Comparator

博客介绍了Java实体Bean的排序方式,包括实现Comparator接口的类对象作为sort入参、使用局部类、匿名类、lambda表达式,以及借助Comparator和lambda表达式进行多条件排序等六种方法,还给出了原文链接。

java的实体bean结构

import java.util.ArrayList;
import java.util.List;
 
public class Human {
    private String name;
    private int age;
 
    public Human() {
    }
 
    public Human(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    @SuppressWarnings("serial")
    public static List<Human> getAInitHumanList() {
        return new ArrayList<Human>() {
            {
                add(new Human("guorao", 10));
                add(new Human("mako", 12));
                add(new Human("hel", 30));
                add(new Human("lin", 28));
            }
        };
    }
 
    @Override
    public String toString() {
        return this.getName() + ":" + this.getAge();
    }
}

第一种:实现Comparator接口的类的对象作为sort的入参

public class HumanComparetor implements Comparator<Human> {
    @Override
    public int compare(Human h1, Human h2) {
        if (h1.getAge() > h2.getAge()) {
            return 1;
        } else if (h1.getAge() == h2.getAge()) {
            return 0;
        } else {
            return -1;
        }
    }
}
    public static void main(String[] args) {
        List<Human> humans = Human.getAInitHumanList();
        Collections.sort(humans, new HumanComparetor());
        System.out.println(humans);
    }


第二种:在方法的局部使用局部类,原理和第一种差不多

    public static void main(String[] args) {
        List<Human> humans = Human.getAInitHumanList();
        //方法内-局部类
        class HumanComparetor implements Comparator<Human> {
            @Override
            public int compare(Human h1, Human h2) {
                return h1.getAge() - h2.getAge();
            }
        }
        Collections.sort(humans, new HumanComparetor());
        System.out.println(humans);
    }

第三种:基于第二种方法,局部类改为匿名类

    public static void main(String[] args) {
        List<Human> humans = Human.getAInitHumanList();
        //匿名类
        Collections.sort(humans, new Comparator<Human>() {
            @Override
            public int compare(Human h1, Human h2) {
                return h1.getAge() - h2.getAge();
            }
        });
        System.out.println(humans);
    }

第四种:使用lamdba表达式->这种形式

    public static void main(String[] args) {
        List<Human> humans = Human.getAInitHumanList();
        //lamdba 表达式 ->
        Collections.sort(humans, (Human h1, Human h2) -> h1.getAge() - h2.getAge());
        System.out.println(humans);
    }


第五种:借助Comparator和lamdba表达式多条件排序

    public static void main(String[] args) {
        List<Human> humans = Human.getAInitHumanList();
        ////lamdba 表达式 ::
        Collections.sort(humans, Comparator.comparing(Human::getAge).thenComparing(Human::getName));
        System.out.println(humans);
    }


第六种:调用方式和第五种有区别,原理一样

    public static void main(String[] args) {
        List<Human> humans = Human.getAInitHumanList();
        //直接用list.sort
        humans.sort(Comparator.comparing(Human::getAge).thenComparing(Human::getName));
        System.out.println(humans);
    }


原文:https://blog.youkuaiyun.com/heliangb46/article/details/77188939 
 

<think>好的,我现在需要帮助用户找到关于如何在Java中实现自定义快速排序的代码示例或教程。首先,用户的问题是关于Java的自定义快速排序实现,所以我需要回顾相关的Java排序知识,尤其是快速排序的实现方法。 首先,我应该回忆快速排序的基本原理。快速排序是一种分治算法,通过选择一个基准元素,将数组分成两部分,一部分小于基准,另一部分大于或等于基准,然后递归地对这两部分进行排序。用户提到“自定义”,这可能涉及如何自定义比较逻辑,比如对对象的不同属性进行排序,或者改变排序顺序(升序或降序)。 接下来,我需要考虑Java中如何实现自定义比较。根据之前学过的知识,Java中可以使用Comparator接口来定义自定义排序规则。特别是Java 8之后,Lambda表达式和函数式接口让实现Comparator更加简洁。参考引用[2]和引用[3]提到,Arrays.sort()和Collections.sort()可以使用自定义比较器,这可能适用于快速排序的自定义实现。 用户需要的是快速排序的自定义实现代码示例,而不是直接使用内置的排序方法。所以,我需要提供一个手写的快速排序算法,同时允许用户传入自定义的比较逻辑。通常,内置的Arrays.sort()对于对象数组使用的是归并排序或TimSort,而快速排序可能需要自己实现。 接下来,我需要构建一个示例代码。这个代码应该包括以下几个部分: 1. 快速排序方法的定义,接受一个泛型数组和一个Comparator参数。 2. 分区函数的实现,根据基准元素将数组分成两部分,这里需要利用Comparator进行元素的比较。 3. 递归调用快速排序方法。 需要注意的是,Java中处理泛型数组可能会有类型安全问题,但可以通过@SuppressWarnings来抑制警告。同时,分区过程需要处理元素的交换和指针移动,确保基准元素的位置正确。 然后,我需要考虑如何演示自定义排序的使用。例如,对一个Person类按照年龄或姓名进行排序。示例中应该包括自定义比较器的两种实现:通过Lambda表达式和匿名内部类。这样用户可以清楚地看到如何调整排序逻辑。 另外,需要指出这种自定义快速排序的优势,比如处理复杂对象的灵活性,以及可能的应用场景,如大数据量排序或需要特定排序规则的情况。同时,也要提到可能的优化方法,比如三数取中法选择基准,或者在小数组时切换到插入排序,以提高性能。 最后,根据用户提供的引用资料,引用[2]和引用[3]涉及到Java中的自定义比较器和排序方法,可以引用这些内容来支持代码中的比较器使用部分。例如,在解释Comparator的作用时,可以引用[2]中关于Lambda表达式自定义比较器的内容。 现在,我需要确保代码示例正确无误,并且注释清晰,帮助用户理解每个步骤的作用。同时,需要验证代码是否符合Java语法,比如泛型的使用、递归的正确处理等。可能还需要测试一下示例代码,确保其能够正确运行,避免出现死循环或数组越界的问题。 总结一下,回答的结构应该包括: 1. 快速排序的基本原理和自定义比较的必要性。 2. 自定义快速排序的代码实现,包括泛型方法和Comparator的使用。 3. 示例:使用自定义比较器对对象数组进行排序。 4. 自定义排序的优势和应用场景。 5. 相关引用,指出Java中自定义排序的相关内容。 然后,根据用户的要求生成相关问题,可能涉及性能优化、应用场景、与其他排序算法的比较等。</think>### 如何用Java实现自定义快速排序 #### 1. 实现原理 快速排序通过选择基准元素(pivot)将数组划分为两个子数组,递归地对子数组排序。自定义排序的核心在于**通过`Comparator`接口实现灵活的比较逻辑**,支持对任意对象的自定义排序规则[^2][^3]。 #### 2. 完整代码示例 ```java import java.util.Comparator; public class QuickSort { /** * 泛型快速排序实现 * @param arr 待排序数组 * @param comparator 自定义比较器 */ public static <T> void quickSort(T[] arr, Comparator<? super T> comparator) { if (arr == null || arr.length <= 1) return; quickSort(arr, 0, arr.length - 1, comparator); } private static <T> void quickSort(T[] arr, int low, int high, Comparator<? super T> comparator) { if (low < high) { int pivotIndex = partition(arr, low, high, comparator); quickSort(arr, low, pivotIndex - 1, comparator); quickSort(arr, pivotIndex + 1, high, comparator); } } private static <T> int partition(T[] arr, int low, int high, Comparator<? super T> comparator) { T pivot = arr[high]; // 选择最后一个元素为基准 int i = low - 1; for (int j = low; j < high; j++) { if (comparator.compare(arr[j], pivot) <= 0) { // 自定义比较逻辑 i++; swap(arr, i, j); } } swap(arr, i + 1, high); return i + 1; } @SuppressWarnings("unchecked") private static <T> void swap(T[] arr, int i, int j) { T temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { // 示例:自定义Person对象排序 class Person { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return name + "(" + age + ")"; } } Person[] people = { new Person("Alice", 25), new Person("Bob", 20), new Person("Charlie", 30) }; // 按年龄升序排序 quickSort(people, (p1, p2) -> p1.age - p2.age); System.out.println("按年龄排序: " + Arrays.toString(people)); // 按姓名字典序排序 quickSort(people, Comparator.comparing(p -> p.name)); System.out.println("按姓名排序: " + Arrays.toString(people)); } } ``` #### 3. 关键代码说明 1. **泛型方法定义**: `public static <T> void quickSort(T[] arr, Comparator<? super T> comparator)` 支持任意对象类型,通过`Comparator`实现自定义比较。 2. **比较逻辑实现**: `comparator.compare(arr[j], pivot) <= 0` 使用传入的比较器决定元素顺序,而非硬编码比较规则。 3. **基准选择优化**: 示例选择最后一个元素为基准,实际可扩展为三数取中法(选择首、中、尾的中位数)。 #### 4. 自定义排序优势 - **灵活适配对象属性**:可对任意字段(如年龄、姓名)排序 - **支持复杂规则**:例如先按年龄降序,再按姓名升序 - **性能优势**:快速排序平均时间复杂度为$O(n \log n)$,适合大规模数据 #### 5. 应用场景 - **对象列表排序**:如用户信息表按不同字段排序 - **动态规则调整**:运行时根据需求切换排序逻辑 - **大数据处理**:内存有限时优于归并排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值