马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
作者:京东物流 秦彪
1. 引言
排序是一个Java开发者,在日常开发过程中随处可见的开发内容,Java中有丰富的API可以调用使用。在Java语言中,作为集合工具类的排序方法,必定要做到通用、高效、实用这几点特征。使用什么样排序算法会比较合适,能够做到在尽量降低时间、空间复杂度的情况下,又要兼顾保证稳定性,达到优秀的性能。可能从性能角度出发首先会想到的是快速排序,或者归并排序。作为jdk提供的通用排序功能,使用又如此频繁,肯定有独特之处,一起来看学习下期中的奥秘。
文中不会过多的介绍几大基本排序算法的方式、由来和思想,主要精力集中在一块探讨java中排序方法所使用的算法,以及那些是值得我们学习和借鉴的内容。文中如有理解和介绍的错误,一起学习,一起探讨,一起进步。
2. 案例
日常使用最为频繁的排序,莫过于如下代码案例,给定一个现有的序列进行一定规则下的排序,配合java8的stream特性,可以很方便的对一个集合进行排序操作(排序规则只是对排序对象及排序方案的限定,不在本文讨论范围内)。- List<Integer> list = Arrays.asList(10, 50, 5, 14, 16, 80);
- System.out.println(list.stream().sorted().collect(Collectors.toList()));
复制代码 在代码执行的过程中SortedOps.java类中 Arrays.sort(array, 0, offset, comparator); 执行了Array集合类型的sort排序算法。- @Override
- public void end() {
- Arrays.sort(array, 0, offset, comparator);
- downstream.begin(offset);
- if (!cancellationWasRequested) {
- for (int i = 0; i < offset; i++)
- downstream.accept(array[i]);
- }
- else {
- for (int i = 0; i < offset && !downstream.cancellationRequested(); i++)
- downstream.accept(array[i]);
- }
- downstream.end();
- array = null;
- }
复制代码 如果使用Collections.sort() 方法如下打印 list1 和 list2 结果一样,且调用的都是 Arrays 集合类中的 sort 方法。- List<Integer> list1 = Arrays.asList(10, 50, 5, 14, 16, 80);
- System.out.println(list1.stream().sorted().collect(Collectors.toList()));
- List<Integer> list2 = Lists.newArrayList();
- list2.addAll(list1);
- Collections.sort(list2);
- System.out.println(list2);
- // 输出:
- // [5, 10, 14, 16, 50, 80]
- // [5, 10, 14, 16, 50, 80]
复制代码 2. Collections.sort 方法介绍
Collections类中关于sort方法定义如下:
[code]public static |