多种排序方式的对比

名称数据对象稳定性平均时间复杂度最坏时间复杂度额外空间复杂度描述
冒泡排序数组稳定O(n^2)O(1)(无序区,有序区)从无序区透过交换找出最大元素放到有序区前端
选择排序数组、链表数组不稳定、链表稳定O(n^2)O(1)(无序区,有序区)在无序区里找一个最小的元素跟在有序区的后面。对于数组,比较的多,换的少
插入排序数组、链表稳定O(n^2)O(1)(无序区,有序区)把无序区里第一个元素插入到有序区的合适的位置。对于数组,比较的少,换的多
快速排序数组不稳定O(nlogn)O(n^2)O(logn)(小数,基准元素,大数)在区间中随机挑选一个元素做基准,将小于基准的元素放在基准的元素之前,大于基准的元素放在基准之后,再分别对小数区与大数区进行排序
希尔排序数组不稳定O(nlog^2n)O(n^2)O(1)每一轮按照事先决定的间隔进行插入排序,间隔会依次缩小,最后一次一定要是1
归并排序数组稳定O(nlog^2n)O(n)+O(logn)如果不是从下到上把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。可从上到下或从下到上进行
归并排序链表稳定O(nlogn)O(1)把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。可从上到下或从下到上进行
堆排序数组不稳定O(nlogn)O(1)(最大堆,有序区)从堆顶把根卸出来放在有序区之前,再恢复堆
计数排序数组、链表稳定O(n+m)O(n+m)统计小于等于该元素值的元素的个数i,于是该元素就放在目标数组的索引i位(i>=0)
桶排序数组、链表稳定O(n)O(m)将值为i的元素放入i号桶,最后依次把桶里的元素倒出来
基数排序数组、链表稳定O(k*n)O(n^2)一种多关键字的排序算法,可用桶排序来实现

Java实现冒泡排序
Java实现选择排序
Java实现直接插入排序
Java实现快速排序
Java实现希尔排序
Java实现归并排序

在Java中,可以通过实现`Comparable`接口来定义对象的自然排序方式,也可以通过实现`Comparator`接口来定义多种排序方式。 如果一个类实现了`Comparable`接口,那么该类的对象就可以使用`Collections.sort()`方法进行排序,这种排序方式被称为自然排序。在实现`Comparable`接口时,需要重写`compareTo()`方法,该方法返回一个整数值,表示当前对象与另一个对象的大小关系。 例如,下面是一个实现了`Comparable`接口的`Person`类: ```java public class Person implements Comparable<Person> { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public int compareTo(Person o) { return this.age - o.age; } } ``` 在上面的代码中,我们实现了`Comparable`接口,并重写了`compareTo()`方法,按照年龄大小进行比较。 如果需要定义多种排序方式,可以实现`Comparator`接口,并重写`compare()`方法。`compare()`方法返回一个整数值,表示第一个参数与第二个参数的大小关系。 例如,下面是一个实现了`Comparator`接口的`PersonComparator`类,可以按照姓名进行比较: ```java public class PersonComparator implements Comparator<Person> { @Override public int compare(Person o1, Person o2) { return o1.getName().compareTo(o2.getName()); } } ``` 在上面的代码中,我们实现了`Comparator`接口,并重写了`compare()`方法,按照姓名的字典序进行比较。 使用`Collections.sort()`方法时,需要传入一个`Comparator`对象作为第二个参数,以指定排序方式。 例如,按照姓名进行排序的代码如下所示: ```java List<Person> list = new ArrayList<>(); list.add(new Person("Tom", 20)); list.add(new Person("Alice", 18)); list.add(new Person("Bob", 22)); Collections.sort(list, new PersonComparator()); for (Person p : list) { System.out.println(p.getName() + " " + p.getAge()); } ``` 输出结果为: ``` Alice 18 Bob 22 Tom 20 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值