Java中Arrays类进行数组排序
2017-07-24 17:36
357 查看
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接口不强制自然排序,可以指定排序
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接口不强制自然排序,可以指定排序
相关文章推荐
- Java中Arrays类进行数组排序
- Java中Arrays类进行数组排序
- Java中Arrays类进行数组排序
- Java中Arrays类进行数组排序
- Java中Arrays类进行数组排序
- java利用冒泡排序对数组进行排序
- 小康陪你学JAVA--------sort方法对数组进行排序
- 【Java】编写一个方法,对字符串数组进行排序,将所有变位词排在相邻的位置
- java对整型数组进行排序
- java代码-----String数组进行排序。是英文的字符串
- java数组数据进行排序输出
- java学习3-冒泡排序对数组进行排序
- java对数组进行排序的方法
- java学习记录——使用Arrays.sort对数组进行升序排序
- JAVA中对一维数组排序的方法(在快速排序上进行的优化)
- java丶对数组值按首字母进行排序
- java对数组进行排序
- java中如何对数组和集合进行排序
- 利用Arrays类中的方法对数组进行排序
- 使用排序算法对数组进行排序,按升序 注:数组内容只会有大写字母,且可能会出现重复,不允许使用java.util下的任何类