详述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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Air系列模块常见问题列表[通俗易懂]

    Air系列模块常见问题列表[通俗易懂]目录名称一、Luatools使用问题1.1烧录下载 1.1.1、2G模块无法烧录下载 1.1.2、2G开发板无法烧录下载 1.1.3、4G模块(开发板)无法烧录下载 1.1.4、生成量产文件时的加密功能有什么用 1.1.5、4G开发模式下的“USB打印Trace、UART1打印Trace、UART2打印Trace”是什么功能 1.1.6、Luat开发方式下可以烧录哪种类型的文件 1.1.7、脚本代码中如何读取通过Luatools烧录进模块的文件 1.1.8、Luat开发方式下可以烧录某

    2022年5月12日
    44
  • 将win server 2003 DHCP角色迁移到win server 2012 R2

    将win server 2003 DHCP角色迁移到win server 2012 R2

    2022年3月8日
    43
  • a4988 脉宽要求_A4988步进电机驱动模块谁用过?

    a4988 脉宽要求_A4988步进电机驱动模块谁用过?A4988是一款完全的微步电动机驱动器,带有内置转换器,易于操作。该产品可在全、半、1/4、1/8及1/16步进模式时操作双极步进电动机,输出驱动性能可达35V及±2A。A4988包括一个固定关断时间电流稳压器,该稳压器可在慢或混合衰减模式下工作。转换器是A4988易于实施的关键。只要在“步进”输入中输入一个脉冲,即可驱动电动机产生微步。无须进行相位顺序表、高频率控制行或复…

    2022年6月17日
    34
  • STM32 的优先级NVIC配置

    STM32 的优先级NVIC配置1、NVIC优先级介绍2、NVIC优先级比较提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):*强调内容***NVIC_PriorityGroup_0>NVIC_PriorityGroup_1>NVIC_PriorityGroup_2>NVIC_PriorityGroup_3>NVIC_PriorityGroup_4前提条件2:“组”优先级别>“抢”占优先级别>“副”优先级别前提

    2022年5月20日
    48
  • npm使用淘宝镜像(npm淘宝镜像安装依赖失败)

    一、node包管理二、网站网站:https://www.npmjs.com三、npm命令工具只要安装了node就已经安装了npmnpm–version查看版本号npminstall–globalnpm升级版本四、npm常用命令npminit生成package.json文件后面加-y可以跳过向导,快速生成npminstallnpminstall包名只下…

    2022年4月10日
    101
  • 揭秘:HR是如何做背景调查的?你真的就可以隐瞒事实了吗?

    揭秘:HR是如何做背景调查的?你真的就可以隐瞒事实了吗?

    2022年2月13日
    81

发表回复

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

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