详述Java中sort排序函数

详述Java中sort排序函数手写一个排序算法的效率是很慢的,当然这也不利于我们在比赛或者工程中的实战,如今几乎每个语言的标准库中都有排序算法,今天让我来给大家讲解一下Java语言中的sort排序Collections类中的sort方法可以实现List接口的集合进行排序降序排序Java中降序排序有俩种方法(和c++很类似,可以看我这篇博客):c++sort排序实现Comparator接口的复写compare()方法排序原理通常,在看有关算法书籍的时候,会发现都说有关数组的排序算法,而且使用的都是随机访问,但是

大家好,又见面了,我是你们的朋友全栈君。


前言

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

  1. 利用 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 + " ");
    }
}
  1. 实现 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的数据量依旧会使用插入排序

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158187.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java数组的声明_Java数组定义常用方法[通俗易懂]

    java数组的声明_Java数组定义常用方法[通俗易懂]Java数组定义常用方法Java中的数组、是一种简单的线性数据存储结构、他用牺牲自动扩展大小来换取与集合相比的唯一优势——查询效率的提升。Java中的数组有什么类型?我们要怎么定义这些数组呢?下面跟yjbys小编一起来学习Java数组定义常用方法吧!java中有两种数据类型:a)引用类型b)基础类型其中基础类型又有两种:b1)数值类型b2)及布尔类型。数组——也为java的一个数据类型、归类为引用…

    2022年6月2日
    43
  • 程序员不成熟的若干个特征

    程序员不成熟的若干个特征人成熟与不成熟跟年龄没有关系,人成熟不成熟,就是你能不能站在对方的角度去看待事物。就是能不能把我的世界变成你的世界。这个社会有很多的成年人,还没有脱离幼稚的行为。一点小事情就跟别人争来争去。人不成熟的第一个特征——就是立即要回报他不懂得只有春天播种,秋天才会收获。很多人在做任何事情的时候,刚刚付出一点点,马上就要得到回报。(学钢琴,学英语等等,刚开始就觉得难,发现不行,立即就要放弃。)做我们这个项目也是一样,很多人来做这个生意,开始没有什么成绩,就想着要放弃,有的人一个月放弃,有的人三个月放弃,有的

    2022年5月27日
    27
  • 在Centos中yum安装和卸载软件的使用方法

    在Centos中yum安装和卸载软件的使用方法yum-yinstall包名(支持*):自动选择y,全自动yuminstall包名(支持*):手动选择yornyumremove包名(不支持*)rpm-ivh包名(支持*):安装rpm包rpm-e包名(不支持*):卸载rpm包安装一个软件时yum-yinstallhttpd安装多个相类似的软件时yum-y

    2022年5月27日
    30
  • 各浏览器的鼠标位置测试

    各浏览器的鼠标位置测试

    2021年8月26日
    42
  • 使用ueditor富文本编辑器导出文本内容时,自定义各个标签的属性,以img标签添加最大宽度为例(vue框架)….[通俗易懂]

    使用ueditor富文本编辑器导出文本内容时,自定义各个标签的属性,以img标签添加最大宽度为例(vue框架)….[通俗易懂]使用ueditor富文本编辑器导出文本内容时,自定义各个标签的属性,以img标签添加最大宽度为例(vue框架)….

    2022年4月20日
    109
  • Apache中 RewriteCond 规则参数介绍[通俗易懂]

    Apache中 RewriteCond 规则参数介绍[通俗易懂]Apache中RewriteCond语句对于我来说一直是个难点,多次试图去把它搞明白,都没有结果,这次我终于算大概知道它的意思了。RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能,为了方便理解,下面来看看几个例子。RewriteEngineonRewriteCond%{HTTP_USER_AGENT}^Mozilla\/5\.0.*Rew…

    2022年6月10日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号