Java中sort排序函数实例详解

 更新时间:2022年06月17日 11:59:12   作者:秋名山码民  
我们经常使用java中的sort排序,确实好用,但是其中原理大多数人都是不了解的,下面这篇文章主要给大家介绍了关于Java中sort排序函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

前言

手写一个排序算法的效率是很慢的,当然这也不利于我们在比赛或者工程中的实战,如今几乎每个语言的标准库中都有排序算法,今天让我来给大家讲解一下Java语言中的sort排序

升序排序

Collections类中的sort方法可以实现List接口的集合进行排序

public static void main(String[] args) {
    // 定义含有5个元素的数组
    double[] scores = new double[] { 78, 45, 85, 97, 87 };
    System.out.println("排序前数组内容如下:");

    // 对scores数组进行循环遍历
    for (int i = 0; i < scores.length; i++) {
        System.out.print(scores[i] + "\t");
    }
    System.out.println("\n排序后的数组内容如下:");

    // 对数组进行排序
    Arrays.sort(scores);

    // 遍历排序后的数组
    for (int j = 0; j < scores.length; j++) {
        System.out.print(scores[j] + "\t");
    }
}

降序排序

Java中降序排序有俩种方法(和c++很类似,可以看我这篇博客):

c++sort排序

利用 Collections.reverseOrder() 方法

public static void main(String[] args) {
    Integer[] a = { 9, 8, 7, 2, 3, 4, 1, 0, 6, 5 };    // 数组类型为Integer
    Arrays.sort(a, Collections.reverseOrder());
    for (int arr : a) {
        System.out.print(arr + " ");
    }
}

实现 Comparator 接口的复写 compare() 方法

public class Test {
    public static void main(String[] args) {
        /*
         * 注意,要想改变默认的排列顺序,不能使用基本类型(int,double,char)而要使用它们对应的类
         */
        Integer[] a = { 9, 8, 7, 2, 3, 4, 1, 0, 6, 5 };
        // 定义一个自定义类MyComparator的对象
        Comparator cmp = new MyComparator();
        Arrays.sort(a, cmp);
        for (int arr : a) {
            System.out.print(arr + " ");
        }
    }
}

// 实现Comparator接口
class MyComparator implements Comparator<Integer> {
    @Override
    public int compare(Integer o1, Integer o2) {
        /*
         * 如果o1小于o2,我们就返回正值,如果o1大于o2我们就返回负值, 这样颠倒一下,就可以实现降序排序了,反之即可自定义升序排序了
         */
        return o2 - o1;
    }
}

排序原理

对sort方法如何排序感到好奇?

通常,在看有关算法书籍的时候,会发现都说有关数组的排序算法,而且使用的都是随机访问,但是我们知道数组的随机访问是很快的,链表的随机访问很慢!实际上,可以使用一种归并排序的方法对链表高效的排序,不过,Java并不是这样做的,它是将所有元素转入一个数组,对数组进行排序,然后,将排好序 的序列复制回列表

事实上Collections.sort方法底层就是调用的Arrays.sort方法,而Arrays.sort使用了两种排序方法,快速排序和优化的归并排序。

快速排序(quick)主要是对那些基本类型数据(int, short, long等)排序, 而归并排序(merge)用于对Object类型进行排序。
使用不同类型的排序算法主要是由于快速排序是不稳定的,而归并排序是稳定的。这里的稳定是指比较相等的数据在排序之后仍然按照排序之前的前后顺序排列。对于基本数据类型,稳定性没有意义,而对于Object类型,稳定性是比较重要的,因为对象相等的判断可能只是判断关键属性,最好保持相等对象的非关键属性的顺序与排序前一致;另外一个原因是由于归并排序相对而言比较次数比快速排序少,移动(对象引用的移动)次数比快速排序多,而对于对象来说,比较一般比移动耗时。
此外,对大数组排序。快速排序的sort()采用递归实现,数组规模太大时会发生堆栈溢出,而归并排序sort()采用非递归实现,不存在此问题。

sort()是根据需要排序的数组的长度进行区分的:

首先先判断需要排序的数据量是否大于60。
小于60:使用插入排序,插入排序是稳定的
大于60的数据量会根据数据类型选择排序方式:
基本类型:使用快速排序。「因为基本类型不需要考虑稳定性」
Object类型:使用归并排序「因为归并排序具有稳定性」

注意:不管是快速排序还是归并排序。在二分的时候小于60的数据量依旧会使用插入排序

关于稳定性,我们用下面这个例子来说明:

假设,有一个已经按照姓名排序的员工列表,现在我们要按照工资进行再次的排序,如果俩个员工的工资又刚好相同怎么办?如果采用稳定的排序方法,将会保留按照姓名的排序,换句话说,我们最后得到的是一个先按照姓名排序,又按照工资排序的一个表

总结

到此这篇关于Java中sort排序函数的文章就介绍到这了,更多相关Java sort排序函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现从Html文本中提取纯文本的方法

    Java实现从Html文本中提取纯文本的方法

    今天小编就为大家分享一篇Java实现从Html文本中提取纯文本的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 使用多种方式实现遍历HashMap的方法

    使用多种方式实现遍历HashMap的方法

    下面小编就为大家带来一篇使用多种方式实现遍历HashMap的方法。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • 轻松掌握Java迭代器模式

    轻松掌握Java迭代器模式

    这篇文章主要帮助大家轻松掌握Java迭代器模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 使用Java和SpringBoot实现服务器发送事件(Server-Sent Events)

    使用Java和SpringBoot实现服务器发送事件(Server-Sent Events)

    使用Java开发web应用,大多数时候我们提供的接口返回数据都是一次性完整返回,有些时候,我们也需要提供流式接口持续写出数据,以下提供一种简单的方式,本文给大家介绍了如何在Java web中实现服务器发送事件,需要的朋友可以参考下
    2024-02-02
  • 深入了解JAVA Jersey框架

    深入了解JAVA Jersey框架

    这篇文章主要介绍了JAVA Jersey的概念以及使用方法,文中讲解非常详细,对大家的学习工作有所帮助,感兴趣的朋友可以参考下
    2020-06-06
  • 对SpringBoot项目Jar包进行加密防止反编译

    对SpringBoot项目Jar包进行加密防止反编译

    最近项目要求部署到其他公司的服务器上,但是又不想将源码泄露出去,要求对正式环境的启动包进行安全性处理,防止客户直接通过反编译工具将代码反编译出来,本文介绍了如何对SpringBoot项目Jar包进行加密防止反编译,需要的朋友可以参考下
    2023-10-10
  • java:程序包org.apache.ibatis.annotations不存在报错解决

    java:程序包org.apache.ibatis.annotations不存在报错解决

    这篇文章主要给大家介绍了关于java:程序包org.apache.ibatis.annotations不存在报错的解决方法,这个错误是我在直接导入springboot项目的时候报错的,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Java用Arrays.fill()初始化二维数组的实现

    Java用Arrays.fill()初始化二维数组的实现

    这篇文章主要介绍了Java用Arrays.fill()初始化二维数组的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 从零搭建脚手架之集成Spring Retry实现失败重试和熔断器模式(实战教程)

    从零搭建脚手架之集成Spring Retry实现失败重试和熔断器模式(实战教程)

    在我们的大多数项目中,会有一些场景需要重试操作,而不是立即失败,让系统更加健壮且不易发生故障,这篇文章主要介绍了从零搭建开发脚手架之集成Spring Retry实现失败重试和熔断器模式,需要的朋友可以参考下
    2022-07-07
  • 浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及SpringMVC 的配置文件

    浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及Spr

    这篇文章主要介绍了浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及SpringMVC 的配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论