分析:在做题的时候用到了需要对int【】的排序,但是用Arrays.sort()无法直接对int【】数组进行降序排列,只能进行升序排列。但是Arrays.sort()可以通过自定义compare()函数来进行任何类型的排序,所以可以通过Integer【】进行排序来达到目的。但是这样做出来的结果,runtime exceeded,说明在进行自动包装和拆包的时候需要耗费大量的时间,从而影响了效率。下面是是测试对int、Integer排序效率的代码:
import java.util.Arrays;
public class MainTest {
private static final int N = 1000000;
public static void main(String[] args) {
Integer[] A = new Integer[N];
int[] B = new int[N];
int n=100;
while(0 != n--){
for(int i=0;i<N;i++){
A[i]=(int) (N*(Math.random()));
B[i]=(int) (N*(Math.random()));
}
long startTime=System.currentTimeMillis(); //获取开始时间
Arrays.sort(A);
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("sort(A)Integer:程序运行时间: "+(endTime-startTime)+"ms");
startTime=System.currentTimeMillis(); //获取开始时间
Arrays.sort(B);
endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("sort(A)Int:程序运行时间: "+(endTime-startTime)+"ms");
}
}
}
通过执行结果,可以看出对Integer排序差不多要多耗费8-10倍的时间。所以通过对Integer【】来降序排列的方法,在要求效率的时候非常不可行。
下面自己实现了快速排序算法(升序),也是用于测试的:
import java.util.Arrays;
public class MainTest {
static final int N = 100000;
static void quickSort(int[] arr,int left,int right) //快速排序算法
{
int f,t;
int rtemp,ltemp;
ltemp = left;
rtemp = right;
f=arr[(left+right)/2]; //分界值
while(ltemp<rtemp)
{
while(arr[ltemp]<f){
++ltemp;
}
while(arr[rtemp]>f){
--rtemp;
}
if(ltemp<=rtemp){
t=arr[ltemp];
arr[ltemp]=arr[rtemp];
arr[rtemp]=t;
--rtemp;
++ltemp;
}
}
if(ltemp==rtemp){
ltemp++;
}
if(left<rtemp){
quickSort(arr,left,ltemp-1); //递归调用
}
if(ltemp<right){
quickSort(arr,rtemp+1,right); //递归调用
}
}
public static void BubbleSort(int[] a){ //简单冒泡排序
for(int i=0;i<N;i++)
for(int j=0;j<N-i-1;j++){
if(a[j]<a[j+1]){
int t =a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
public static void main(String[] args) {
Integer[] A = new Integer[N];
int[] B = new int[N];
int n=1;
while(0 != n--){
for(int i=0;i<N;i++){
A[i]=(int) (N*(Math.random()));
B[i]=(int) (N*(Math.random()));
}
long startTime=System.currentTimeMillis(); //获取开始时间
quickSort(B,0,N-1);
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("我的快排:程序运行时间: "+(endTime-startTime)+"ms");
startTime=System.currentTimeMillis(); //获取开始时间
BubbleSort(B);
endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("简单冒泡:程序运行时间: "+(endTime-startTime)+"ms");
startTime=System.currentTimeMillis(); //获取开始时间
Arrays.sort(A);
endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("sort(Integer):程序运行时间: "+(endTime-startTime)+"ms");
startTime=System.currentTimeMillis(); //获取开始时间
Arrays.sort(B);
endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("sort(Int):程序运行时间: "+(endTime-startTime)+"ms");
}
}
}