您的位置:首页 > 编程语言 > Java开发

Java中Arrays类进行数组排序

2017-07-24 17:36 211 查看
Java中Arrays类实际是一个实现对数组操作的各种方法的类,可以实现对数组的排序和搜索,数组的比较和对数组增加元素,数组的拷贝和数据转换为字符串的功能。今天我们就来说说Arrays.sort()对数组进行排序的规则。

1.对基本类型的数组进行排序

(1)Arrays类中的sort()使用的是经过调优的快速排序算法;

(2)对于int[],double[],char[]等基本数据类型的数组,Arrays类只提供了默认的升序排列,并没有提供相应的降序排列方法;

       数组排序函数原型:

       static void sort(int[] a)  对指定的int型数组按数字升序进行排序

       static void sort (int[] a,int fromIndex,int toIndex)  对指定int型数组的指定范围按数字升序进行排序

例如:

   


输出结果:



Arrays.sort()底层实现采用了快速排序。快速排序的思想是:首先选取一个基准,这个基准可以是第一个数字也可以是任意数值,然后用两个指针left和right分别指向所要排序的数组的0号位置和length-1号位置,在保证left<right的前提下,先从后向前遍历寻找第一个小于该基准的数字,进而与left位置的数字进行交换,接下来再从前向后遍历寻找第一个大于该基准的数字,进而与right所指向的位置的数字进行交换,以此类推,一次遍历下来我们将会的到一个在基准左边都是小于基准的数字,在基准右边都是大于基准的数字。快速排序在一般情况下它的时间复杂度为O(n*logn),但是在我们输入一组完全有序或者基本有序的数组的情况下,快速排序算法将退换为冒泡排序算法,时间复杂度会变味O(n^2),这种情况也是可以改变的,当我们在选取基准时,我们可以采用三位取中法,即在arr[left],arr[(left+right)/2],arr[right]三者中取中间值作为基准,这样会避免我们在最坏情况下快速排序算法性能的降低。

2.对复合数据类型的数据的排序

    函数原型:

    public static<T> void sort(T[] a,Comparator c)   根据指定比较器产生的顺序对指定对象数组进行排序

    public static<T> void sort(T[] a,int fromIndex,int toIndex,Comparator c)   根据指定比较器产生的顺序对指定对象数组的指定范围进行排序

    这两个排序算法是经过调优的归并排序算法

 例如:



输出结果:



既然这里用到了Comparator比较器对象,那我们就来说说Java中的两种比较器Comparable和Comparator

区别:①Comparable位于java.lang包下,Comparator位于java.util包下;

           ②实现Comparable接口要重写ComparetTo()方法,实现Comparator接口需要重写compare()方法;

           ③Comparable接口将比较代码嵌入需要进行比较的类的自身代码中,Comparator接口要在一个单独的类中实现比较;


           ④如果前期类设计没有考虑到类的比较问题而没有实现Comparable接口,后期可以通过Comparator接口来实现算法进行排序;


           ⑤Comparable接口强制进行自然排序,Comparator接口不强制自然排序,可以指定排序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: