Java中排序算法的优化方案

1、byte数组

    对byte数组的排序分为两种情况:

    a、元素个数较少

        插入排序

    b、元素个数多

        计数排序

对于byte由于其大小为一个字节,总共的可能存在的个数为2^8个,所以用计数排序只需要一个额外的256的空间。

2、char数组

       对与char数组的排序分三种情况:

    a、元素个数较少

        插入排序

    b、元素个数较多

        归并或是快速排序(都是采用优化过的方法):

         程序首先会扫描一遍数组,统计下连续的递增区域和连续的递减区域的个数,如果递增区域和递减区域较多,则数组局部有序性较高,混乱程度较小,所以才用归并算法,否则数组的混乱程度越高,采用快排算法。

        优化的归并:归并不用递归归并而是采用循环归并。原数组A与辅助数组B,在递归方法中将排好序的内容放到辅助数组B中后还需要将B中的内容同步到A中。而在循环的归并中,将A数组与B数组交替用作辅助数组,从而省去了从辅助数组copy到原数组的时间。

        优化的快排:

                普通快排,找一个target值,然后进行partition,将原数组划分为两部分。优化的方法中一次有两个target值,然后将数组分为三部分,<target1, target1<=~<=target2, target2<.

                同时当将数组划分为较小的区域时,每个区域采用优化的插入排序,此插入排序每次插入两个数。首先将两个数中较大的插入到相应位置,则较小值所在位置一定在这个位置之后,所以继续将较小的数值插入进去。

    c、元素个数非常多

       与byte数组类似,采用2^16的额外空间,采用计数排序。

3、int数组

    与char数组的方法一致,只是没有第三种情况,即int数组不采用计数排序。

4、object

    对于对象的排序,不同于基本类型。对于对象一般要求排序算法是稳定的,所以一般采用插入和归并排序。

    对象的比较操作一般比较耗时,所以减少比较次数可以提高排序速度。在数据量较多时,会先将数据分为固定长度的小段,每个小段采用插入排序,在插入排序中用二分查找来确定值所需要插入的位置。然后再采用循环归并的方法进行排序。

 

点赞