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值,然后将数组分为三部分,
同时当将数组划分为较小的区域时,每个区域采用优化的插入排序,此插入排序每次插入两个数。首先将两个数中较大的插入到相应位置,则较小值所在位置一定在这个位置之后,所以继续将较小的数值插入进去。
c、元素个数非常多
与byte数组类似,采用2^16的额外空间,采用计数排序。
3、int数组
与char数组的方法一致,只是没有第三种情况,即int数组不采用计数排序。
4、object
对于对象的排序,不同于基本类型。对于对象一般要求排序算法是稳定的,所以一般采用插入和归并排序。
对象的比较操作一般比较耗时,所以减少比较次数可以提高排序速度。在数据量较多时,会先将数据分为固定长度的小段,每个小段采用插入排序,在插入排序中用二分查找来确定值所需要插入的位置。然后再采用循环归并的方法进行排序。