Java sort 源码解析 primitive part

来源:互联网 发布:tomsinsight知乎专栏 编辑:程序博客网 时间:2024/05/01 22:32

    Java Arrays中提供了对所有类型的排序。其中主要分为primitive和Object两大类,分别使用了快速排序与合并排序。本章以int[] 的排序,讲解Java对primitive排序。

    首先大家要了解什么是快速排序,它有什么优点,这些我就不累述了,给出地址。http://zh.wikipedia.org/zh/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F

quick_sort

在了解了基本原理之后,上图可以动态的展示快速排序的基本思路。很经典~

 

接下来,我们展示源码,并仔细讲解!

 

这个方法是对外暴露的调用接口。 sort1 是排序方法的主体,传入参数分别为:待排序数组,排序起始位置,待排序元素长度。

sort1中使用到另外3个方法,首先介绍。

 

1. swap:简单的使用中间变量来交换数组内元素。

 

2.med3:计算中值。

 

3.vecswap:批量移动元素

 

万事俱备,开始详解。

开头部分便判断,如果数组长度小于7,便使用插入方法排序。

 

如果长度较长,便需要利用快速排序,第一步就是找到合适的主元。这里并不是简单使用数组第一位作为主元,而是通过计算得到。

这么做是快速排序的一个变种。不过即不是随机快排,也不是平衡快排,倒更像是将两者所结合。不过找主元这个事,对数组排序效率的影响,都是拼人品的事情。

v 便是通过计算得到的中值。在以后的计算中,充当主元的角色。

 

这段便是一次快排。大致思路是将小于主元并在主元左边的,与大于主元并在主元右边的数,保留原位。(没有swap,只是b++和c--)否则,互换位置(swap(x,b++,c--))。等于中值的,与最两边数互换位置。(第一第二个swap)。

这样,数组便是中间由小于主元的数(左边)和大于主元的数(右边),以及主元本身(最左边,最右边)组成。

 

 

将经过一次快排后的数组重新组合。大致意思是,将两边存在的主元,与中间位置的数对调位置。形成最终主元在中间,左边均比主元小,右边均比主元大的数组。

其中为了提高性能,判断了移动元素的个数要竟可能少。

s=Math.min(a-off,b-a); a-off:是最左边主元个数,b-a是小于主元的个数。取最小值。vecswap(x,off,b-s,s);  将他们位置对调,即保真主元回到中间位置。

同理:s=Math.min(d-c,n-d-1); d-c:大于主元个数,n-d-1是最右边主元个数。再利用vecswap对调。

 

分片迭代。接下来,就是将左边和右边不等于中值的,用递归再进行排序。

b-a,即小于主元的元素个数大于1时,才有必要继续迭代排序。

同理,d-c 是大于主元的元素个数,大于1时才继续迭代排序。

 

 

原创粉丝点击