[Java] java.util.Arrays 中使用的 sort 采用的算法 (转)
http://book.douban.com/annotation/15154366/
Q: java.util.Arrays 中使用的 sort 采用的是什么算法?
A: java中Arrays.sort使用了两种排序方法,quick sort 和优化的 merge sort。
Q: 为什么采用两种排序算法?
A: quick sort 主要是对哪些基本类型数据(int, short, long, float, double等)排序, 而 merge sort 用于对对象类型进行排序。
Q: quick sort 在统计意义上效率比 merge sort 高,为何不都采用 quick sort ?
A: 概括的说,一个是稳定性,一个是移动次数。使用不同类型的排序算法主要是由于 quick sort 是不稳定的,而 merge sort 是 stable 的。这里的 stable 是指比较相等的数据在排序之后仍然按照排序之前的前后顺序排列(保序性)。对于基本数据类型,稳定性没有意义。而对于对象类型,稳定性是比较重要的,因为对象相等的判断可能只是判断关键属性,最好保持相等对象的非关键属性的顺序与排序前一直;另外一个原因是由于合并排序相对而言比较次数比快速排序少,移动(对象引用的移动)次数比快速排序多,而对于对象来说,比较一般比移动耗时。
merge sort
(1)最坏时间复杂度是 O(nlgn);
(2)平均时间复杂度是 O(nlgn);
(3)空间复杂度是 O(1)。
quick sort
(1)最坏时间复杂度是 O(n^2);
(2)平均时间复杂度是 O(nlgn);
(3)空间复杂度是 O(n)。
验证了一下 java.util.Arrays.sort(arrayName) 的时间复杂度,程序如下:
- /* constant variables */
- final int NUM = 10;
- final int OFFSET = 2;
- final int LOOP = 100000;
- /* arrays */
- int[][] array = new int[NUM][];
- long[] start = new long[NUM];
- long[] end = new long[NUM];
- long[] cost = new long[NUM];
- /* initialization */
- for (int i = 0; i < array.length; ++i) {
- array[i] = new int[1 << (i * OFFSET)];
- }
- for (int i = 0; i < array.length; ++i) {
- for (int j = 0; j < array[i].length; ++j) {
- array[i][j] = (int)(Math.random());
- }
- }
- /* sorting */
- for (int count = 0; count < LOOP; ++count) {
- for (int i = 0; i < array.length; ++i) {
- start[i] = System.currentTimeMillis();
- Arrays.sort(array[i]);
- end[i] = System.currentTimeMillis();
- cost[i] += end[i] - start[i];
- }
- }
- /* output */
- for (int i = 0; i < cost.length; ++i) {
- System.out.println(
- "n = " + array[i].length +
- ", time = " + cost[i] / 1000.0
- );
- }
对不同规模n的数组,分别进行10万次排序,统计10万次排序的总时间,结果如下:
n = 1, time = 0.013s
n = 4, time = 0.011s
n = 16, time = 0.029s
n = 64, time = 0.066s
n = 256, time = 0.198s
n = 1024, time = 0.797s
n = 4096, time = 3.005s
n = 16384, time = 12.101s
n = 65536, time = 48.101s
n = 262144, time = 192.174s
http://book.douban.com/annotation/15154366/
[Java] java.util.Arrays 中使用的 sort 采用的算法 (转)的更多相关文章
- 源码(09) -- java.util.Arrays
java.util.Arrays 源码分析 ------------------------------------------------------------------------------ ...
- java:数组操作工具类 java.util.Arrays包 主要方法详解
Arrays类位于Java.util包下,是一个对数组操作的工具类,现将Arrays类中的方法做一个总结(JDK版本:1.6.0_34).Arrays类中的方法可以分为八类: sort(对数组排序) ...
- JDK源码(1.7) -- java.util.Arrays
java.util.Arrays 源码分析 ------------------------------------------------------------------------------ ...
- java 中java.util.Arrays类---常用函数记录
java.util.Arrays主要是用来对数组进行操作的类,主要包括以下方法: 1.数组转化列表,得到固定大小的列表,Arrays.asList(...): public static <T& ...
- Java中数组操作 java.util.Arrays 类常用方法的使用
任何一门编程语言,数组都是最重要和常用的数据结构之一,但不同的语言对数组的构造与处理是不尽相同的. Java中提供了java.util.Arrays 类能方便地操作数组,并且它提供的所有方法都是静态的 ...
- Java找N个数中最小的K个数,PriorityQueue和Arrays.sort()两种实现方法
最近看到了 java.util.PriorityQueue.刚看到还没什么感觉,今天突然发现他可以用来找N个数中最小的K个数. 假设有如下 10 个整数. 5 2 0 1 4 8 6 9 7 3 怎么 ...
- java.util.Arrays的使用
在Java.util包中有一个工具类Arrays类,封装了一些操作数组的方法.简单使用如下: package com.arrays.test; import java.util.Arrays; pub ...
- Java 数组基础,java.util.Arrays
定义数组 方式1(推荐,更能表明数组类型) 方式2(同C语言) 方式3定义时直接初始化 数组运用基础 数组长度 equals() 数组元素不为基本数据类型时 二维数组 二维数组基础 变长的二维数组 j ...
- JDK1.8源码(四)——java.util.Arrays 类
java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用. 1.asList public static ...
随机推荐
- (1)第一个ASP.NET Web API
Install-Package Microsoft.AspNet.WebApi . Global.asax protected void Application_Start() { AreaReg ...
- Java集合源码学习(一)集合框架概览
>>集合框架 Java集合框架包含了大部分Java开发中用到的数据结构,主要包括List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Array ...
- C# 读取CSV文件
CSV文件是用逗号作为分隔符的,所以如果是简单的CSV文件,用split(',')就可以了. 但是Excel 编辑CSV文件,且内容中有逗号,得到的csv文件如下:"aaa,aaa" ...
- 【JAVA IO流之字符流】
一.概述. java对数据的操作是通过流的方式.java用于操作流的对象都在IO包中.流按照操作数据不同分为两种,字节流和字符流.流按照流向分为输入流,输出流. 输入输出的“入”和“出”是相当于内存来 ...
- Oracle备份及备份策略
第二章. 了解备份的重要性 可以说,从计算机系统出世的那天起,就有了备份这个概念,计算机以其强大的速度处理能力,取代了很多人为的工作,但是,往往很多时候,它又是那么弱不禁风,主板上的芯片.主板电路.内 ...
- UML- 模型图介绍
第一类 用例图 第二类 静态图 类图 对象图 包图第三类 行为图 状态图 活动图第四类 交互图 序列图 协助图第五类 实现图 构件图 部署图 1 用例图:从用户角度描述系统功能,以及每个系统功 ...
- VS2012 OpenCV2.4.9 Debug可以允许,Release不可以
一个简单的程序 #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgu ...
- Java Web 项目获取运行时路径 classpath
假设资源文件放在maven工程的 src/main/resources 资源文件夹下,源码文件放在 src/main/java/下, 那么java文件夹和resources文件夹在运行时就是class ...
- Android ViewPager使用详解(转)
这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等.那如 ...
- 从DataReader中手动串行化JSON
void WriteDataReader(StringBuilder sb, IDataReader reader) { ) { sb.Append("null"); return ...