一、Arrays.sort使用的排序算法
直接开门见山
快速排序主要是对哪些基本类型数据(int,short,long等)排序,而合并排序用于对对象类型进行排序。使用不同类型的排序算法主要是由于快速排序是不稳定的,而合并排序是稳定的
归并排序相对而言比较次数比快速排序少,移动(对象引用的移动)次数比快速排序多,而对于对象来说,比较一般比移动耗时。补充一点合并排序的时间复杂度是n logn,快速排序的平均时间复杂度也是n logn,但是合并排序的需要额外的n个引用的空间。
源码中的快速排序,主要做了以下几个方面的优化:
1)当待排序的数组中的元素个数较少时,源码中的阀值为7,采用的是插入排序。尽管插入排序的时间复杂度为0(n^2),但是当数组元素较少时,插入排序优于快速排序,因为这时快速排序的递归操作影响性能。
2)较好的选择了划分元(基准元素)。能够将数组分成大致两个相等的部分,避免出现最坏的情况。例如当数组有序的的情况下,选择第一个元素作为划分元,将使得算法的时间复杂度达到O(n^2).
3)根据划分元 v,形成不变式 v*(
源码中选择划分元的方法:
1)当数组大小为 size=7时,取数组中间元素作为划分元。int n=m>>1;(此方法值得借鉴)。
2)当数组大小size大于7小于等于40时,取首、中、末三个元素中间大小的元素作为划分元。
3)当数组大小 size>40时,从待排数组中较均匀的选择9个元素,选出一个伪中数做为划分元。
普通的快速排序算法,经过一次划分后,将划分元排到素组较中间的位置,左边的元素小于划分元,右边的元素大于划分元,而没有将与划分元相等的元素放在其附近,这一点,在Arrays.sort()中得到了较大的优化。
举例:15、93、15、41、6、15、22、7、15、20
举例:15、93、15、41、6、15、22、7、15、20
因size大于7小于等于40,所以在15、6、和20中选择v= 15作为划分元。
经过一次换分后: 15、15、7、6、41、20、22、93、15、15.与划分元相等的元素都移到了素组的两边。
接下来将与划分元相等的元素移到数组中间来,形成:7、6、15、15、15、15、41、20、22、93.
最后递归对两个区间进行排序[7、6]和[41、20、22、93].,所以在15、6、和20中选择v= 15作为划分元。
二、JAVA中Arrays.sort()排序的原理是什么
有的时候需要对数组里的element进行排序。当然可以自己编写合适的排序方法,但既然java包里有自带的Arrays.sort排序方法,在数组元素比较少的时候为何不用?
Sorting an Array 1.数字排序 int[] intArray= new int[]{ 4, 1, 3,-23};
Arrays.sort(intArray);
输出: [-23, 1, 3, 4]
2.字符串排序,先大写后小写 String[] strArray= new String[]{"z","a","C"};
Arrays.sort(strArray);
输出: [C, a, z]
3.严格按字母表顺序排序,也就是忽略大小写排序 Case-insensitive sort
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
输出: [a, C, z]
4.反向排序, Reverse-order sort
Arrays.sort(strArray, Collections.reverseOrder());
输出:[z, a, C]
5.忽略大小写反向排序 Case-insensitive reverse-order sort
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
Collections.reverse(Arrays.asList(strArray));
输出: [z, C, a]
java初学者最常见的错误思想,就是试图去写一些方法来完成数组的排序功能,其实,数组排序功能,在java的api里面早已实现,我们没有必要去重**造轮子。
Arrays类有一个静态方法sort,利用这个方法我们可以传入我们要排序的数组进去排序,因为我们传入的是一个数组的引用,所以排序完成的结果也通过这个引用的来更改数组.对于整数、字符串排序,jdk提供了默认的实现,如果要对一个对象数组排序,则要自己实现 java.util.Comparator接口。
packagecom.gjh.gee.arrays;
importjava.util.Arrays;
publicclassArraySortDemo{
publicvoidsortIntArray(){
int[]arrayToSort=newint[]{48,5,89,80,81,23,45,16,2};
System.out.println("排序前");
for(inti=0;i<arrayToSort.length;i++)
System.out.println(arrayToSort[i]);
//调用数组的静态排序方法sort
Arrays.sort(arrayToSort);
System.out.println("排序后");
for(inti=0;i<arrayToSort.length;i++)
System.out.println(arrayToSort[i]);
}
publicvoidsortStringArray(){
String[]arrayToSort=newString[]{"Oscar","Charlie","Ryan",
"Adam","David"};
System.out.println("排序前");
for(inti=0;i<arrayToSort.length;i++)
System.out.println(arrayToSort[i]);
System.out.println("排序后");
//调用数组的静态排序方法sort
Arrays.sort(arrayToSort);
for(inti=0;i<arrayToSort.length;i++)
System.out.println(arrayToSort[i]);
}
publicvoidsortObjectArray(){
Dogo1=newDog("dog1",1);
Dogo2=newDog("dog2",4);
Dogo3=newDog("dog3",5);
Dogo4=newDog("dog4",2);
Dogo5=newDog("dog5",3);
Dog[]dogs=newDog[]{o1,o2,o3,o4,o5};
System.out.println("排序前");
for(inti=0;i<dogs.length;i++){
Dogdog=dogs[i];
System.out.println(dog.getName());
}
Arrays.sort(dogs,newByWeightComparator());
System.out.println("排序后:");
for(inti=0;i<dogs.length;i++){
Dogdog=dogs[i];
System.out.println(dog.getName());
}
}
publicstaticvoidmain(String[]args){
ArraySortDemot=newArraySortDemo();
t.sortIntArray();
t.sortStringArray();
t.sortObjectArray();
}
}
三、Arrays.sort的用法
1.sort(byte[] a)
对指定的 byte型数组按数字升序进行排序。sort(byte[] a, int fromIndex, int toIndex)对指定 byte型数组的指定范围按数字升序进行排序。sort(char[] a)对指定的 char型数组按数字升序进行排序。sort(char[] a, int fromIndex, int toIndex)对指定 char型数组的指定范围按数字升序进行排序。sort(double[] a)对指定的 double型数组按数字升序进行排序。sort(double[] a, int fromIndex, int toIndex)对指定 double型数组的指定范围按数字升序进行排序。sort(float[] a)对指定的 float型数组按数字升序进行排序。sort(float[] a, int fromIndex, int toIndex)对指定 float型数组的指定范围按数字升序进行排序。sort(int[] a)对指定的 int型数组按数字升序进行排序。sort(int[] a, int fromIndex, int toIndex)
2.sort(long[] a)
对指定的 long型数组按数字升序进行排序。sort(long[] a, int fromIndex, int toIndex)对指定 long型数组的指定范围按数字升序进行排序。sort(Object[] a)根据元素的自然顺序,对指定对象数组按升序进行排序。sort(Object[] a, int fromIndex, int toIndex)根据元素的自然顺序,对指定对象数组的指定范围按升序进行排序。sort(short[] a)对指定的 short型数组按数字升序进行排序。sort(short[] a, int fromIndex, int toIndex)对指定 short型数组的指定范围按数字升序进行排序。sort(T[] a, Comparator<? super T> c)根据指定比较器产生的顺序对指定对象数组进行排序。sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c)根据指定比较器产生的顺序对指定对象数组的指定范围进行排序。
四、初学JAVA,用Arrays.sort()排序,为什么总是数不出结果
在Arrays类中,已实现的明确参数类型的sort方法,并没有二维数组这个参数类型,你这里调用又没报错,应该是使用了参数类型为Object数组的sort方法,既调用时将你的二维数组转成了object数组,看源码你会发现,在这个方法往下执行的时候,会在某一个步骤发生类型转换,也就是将你数组中每一个元素类型转成comparable类型,进而调用compareto方法,可是你原先是二维数组,那么object数组的每一个元素就是一个数组类型,怎么可能有int数组类型能转成comparable类型的,所以强转肯定报错,解决方法:调用使用泛型参数的sort方法,然后自己实现comparable接口,也就是方法的第二个参数;具体排序规则得看你对这二维数组的需求了
文章分享结束,详解Arrays.sort()排序和JAVA中Arrays.sort()排序的原理是什么的答案你都知道了吗?欢迎再次光临本站哦!