文章目录

  • 前言
  • 升序排序
  • 降序排序
  • 排序原理

前言

手写一个排序算法的效率是很慢的,当然这也不利于我们在比赛或者工程中的实战,如今几乎每个语言的标准库中都有排序算法,今天让我来给大家讲解一下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 };    // 数组类型为IntegerArrays.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> {@Overridepublic 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排序函数相关推荐

  1. JAVA中的排序函数

    JAVA中的排序函数包括java.util.Arrays包中的Arrays.sort();java.util.Collections包中的Collections.sort() 1.Arrays.sor ...

  2. C++中sort()排序函数应用

    ** C++中sort()排序函数应用 ** sort(first_pointer,first_pointer+n,cmp) 该函数可给数组,或者链表list.向量排序. 实现原理:sort并不是简单 ...

  3. java中Collections.sort() 排序函数的用法

    java中Collections.sort() 排序函数的用法: 用Collections.sort方法对list排序有两种方法 第一种是list中的对象实现Comparable接口,如下: /** ...

  4. java中sort函数的使用

    java中sort函数的使用 写在前面 sort函数的基本格式 第一种基本格式 第二种基本格式 第三种基本格式cmp 函数的基本格式 写在前面 想必大家都知道C++里面的sort用过的都知道这个函数是 ...

  5. [CodeForces 892A] Greed (Java中sort实现从大到小排序)

    题目链接:http://codeforces.com/problemset/problem/892/A 具体的Java 中 sort实现降序排序:https://www.cnblogs.com/you ...

  6. Java中sort实现降序排序

    Java中sort实现降序排序 利用Collections的reverseOrder方法: import java.util.Arrays; import java.util.Collections; ...

  7. java中自然排序和比较器排序

    这里所说到的Java中的排序并不是指插入排序.希尔排序.归并排序等具体的排序算法.而是指执行这些排序算法时,比较两个对象"大小"的比较操作.我们很容易理解整型的 i>j 这样 ...

  8. java中的排序方法,Java中的排序比较方式:自然排序和比较器排序

    这里所说到的Java中的排序并不是指插入排序.希尔排序.归并排序等具体的排序算法.而是指执行这些排序算法时,比较两个对象"大小"的比较操作.我们很容易理解整型的 i>j 这样 ...

  9. python数组排序sort_详解python中sort排序使用

    1.前言 昨天一学妹问我一个关于python的问题,当时在外忙碌,没时间细看.今天看一下,咋一看我还真的不知道这个问题,bookinfo.sort(reverse=True ,key=lambda x ...

最新文章

  1. Eclipse 搭建struts2 spring3 hibernate3环境实战 待完善
  2. php umount强制,linux mount挂载与umount 卸载及“Device is busy”问题 | 璞玉(POOY)
  3. js实现随机生成小方块
  4. linux源码_从linux源码看epoll及epoll实战揭秘
  5. C#学习之向量运算符重载
  6. birt插件 web_birt 集成到现有的web应用中
  7. 红米note3支持html,红米note3如何检测硬件信息?指令代码说明
  8. hdu1533解题报告
  9. Atitit v2 工作计划与工作日志推荐格式markdown 与模板 attilax 总结
  10. redis 编译/调试
  11. spss数据分析_相关分析
  12. java日文_怎么用java编写个应用程序,让其输出日文表
  13. 软件测试需要学什么?全网最全软件测试必备7大技能详解,摇身一变资深测试
  14. windows自动开关机教程
  15. 【Linux】Ubuntu16.04使用拾遗2
  16. 如何在Windows 10中打开设置?
  17. uni - app的 nfc功能使用鱼住未来第三方插件完成
  18. nand flash、nor flash、sdram、ram、dram的区别
  19. 微信小程序——云开发的安全规则
  20. 结构化数据和非结构化数据、半结构化数据的区别-归纳总结整理

热门文章

  1. STM32配合cubeMX硬件I2C驱动0.96寸OLED
  2. php mpdf 设置字体,php - 将字体添加到mPDF - 堆栈内存溢出
  3. window.print()打印时,如何自定义页眉/页脚、页边距
  4. LCN 分布式事务框架
  5. 2022 OpenCV AI 竞赛来啦!详细介绍Spatial AI赛道!
  6. python超市抹零结账程序_商家收款“四舍五入”合理吗?超市“抹零”现象引质疑...
  7. 深度学习方法(九):自然语言处理中的Attention Model注意力模型
  8. git gitolite 搭建git服务器
  9. 变频器由计算机控制,变频器练习题
  10. matlab gui停止键,在MATLAB的过程中停止GUI