Arrays.sort和快速排序

今天在写快排和冒泡的时间比较,后来发现碾压,没办法我就召唤出了Java自带的Arrays.sort想与它一较高低。

首先贴代码:

快排:

//快排
	public static void QuickSort(int array[], int low, int high)
	{
	    int i = low; 
	    int j = high;
	    int x;
	    if(i > j)
	        return;
	    int temp = array[low];
	    while(i != j)
	    {
	        while(array[j] >= temp && i < j)
	            j--;
	        while(array[i] <= temp && i < j)
	            i++;
	        if(i < j){
	        	qsum+=1;
	        	x=array[i];
	        	array[i]=array[j];
	        	array[j]=x;
	        }
	    }
	    //将基准temp放于自己的位置,(第i个位置)
	    x=array[low];
	    array[low]=array[i];
	    array[i]=x;
	    qsum+=1;
	    QuickSort(array, low, i - 1);
	    QuickSort(array, i + 1, high);
	}

冒泡:

//冒泡
    static void maopao(int array[]){
    //循环的次数为数组长度减一,剩下的一个数不需要排序
    for(int i=0;i<array.length-1;++i){
        boolean noswap=true;
        //循环次数为待排序数第一位数冒泡至最高位的比较次数
        for(int j=0;j<array.length-i-1;++j){
            if(array[j]>array[j+1]){
                array[j]=array[j]+array[j+1];
                array[j+1]=array[j]-array[j+1];
                array[j]=array[j]-array[j+1];
                //交换或者使用如下方式
                //a=a^b;
                //b=b^a;
                //a=a^b;
                msum+=1;
                noswap=false;
            }
        }
        if(noswap) break;
    }
    }

Main:

public static void main(String args[]){
		int alen=10000;
		int[] a=new int[alen];
		int[] b=new int[alen];
		int[] c=new int[alen];
		int d;
		for(int i=0;i<alen;i++){
			d=(int)(Math.random()*alen*1000+1);
			a[i]=d;
			b[i]=d;
			c[i]=d;
		}
		//快排
		long qstart=System.nanoTime();
	    QuickSort(a, 0, a.length-1);
	    long qt=System.nanoTime()-qstart;
	    //冒泡
	    long mstart=System.nanoTime();
		maopao(b);
		long mt=System.nanoTime()-mstart;
		//Arrays.sort
		long zstart=System.nanoTime();
	    Arrays.sort(c);
	    long zt=System.nanoTime()-zstart;
		
	    System.out.println("快排交换次数: "+qsum+" ,用时: "+qt/1000.0+"ms");
	    System.out.println("冒泡交换次数: "+msum+" ,用时: "+mt/1000.0+"ms");
	    System.out.println("Java自带排序用时: "+zt/1000.0+"ms");
	}

用Math.random()随机产生了一些数字让数组去排序,因为java数组对象用的是引用,所以就很蠢的创建了三个数组。冒泡是炮灰不用管它。

结果是这样的:

上面代码需要手动按Ctrl+F11,比较样本比较少,所以我改造了一下Main,顺便让冒泡也休息了。

New Main:

public static void main(String args[]){
		int qwin=0;
		for(int q=0;q<10000;q++){
			int alen=10000;
			int[] a=new int[alen];
			int[] b=new int[alen];
			int[] c=new int[alen];
			int d;
			for(int i=0;i<alen;i++){
				d=(int)(Math.random()*alen*1000+1);
				a[i]=d;
				b[i]=d;
				c[i]=d;
			}
			//快排
			long qstart=System.nanoTime();
		    QuickSort(a, 0, a.length-1);
		    long qt=System.nanoTime()-qstart;

			//Arrays.sort
			long zstart=System.nanoTime();
		    Arrays.sort(c);
		    long zt=System.nanoTime()-zstart;
		    qsum=0;
		    if(qt>zt){
		    	qwin+=1;
		    }
		}
		System.out.println("快排胜利几率: "+qwin/10000.0);
	}

结果是这样的:

所以大部分情况下都是自己写的快排快,难道是我打开的方式不对?

还是说JAVA出于某种考虑(用快排比较浪费空间)还是什么其他的原因?

希望有大佬可以看到这个解读一下我的疑问。我用的是JDK8。

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值