快速排序优化

当输入数据基本有序时,插入排序的速度很快。因此我们可以利用这一点来提高快速排序的的速度。当对一个小于k的子数组数组调用快速排序时,让他不做任何排序就返回。当上层的快速排序调用返回后,对整个数组运行插入排序来完成排序过程。因此我们在快速排序基础上加上一个插入排序,并且在快速排序中修改当子数组长度小于k时调用插入排序。

对k取不同时间测运行时间

package test;

import java.util.Random;

public class QuickSort {
	
	public int partition(int[] A, int p, int r) {
		int x = A[r];
		int i =p-1;
		for(int j = p; j < r; j++)
		{
			if(A[j]<=x)
			{
				i = i+1;
				swap(A,i,j);
			}
		}
		swap(A,i+1,r);
		return i+1;
	
	}
	
	public void InsertionSort(int[] A,int p,int r)
	{
		int key;
		int i,j;
		for( j =p+1; j<=r; j++)
		{
			key = A[j];
			i=j-1;
			while(i>=0 && A[i]>key)
			{
				A[i+1]=A[i];
				i=i-1;
			}
			A[i+1] = key;
		}
	}
	
	public void quicksort(int[] A,int p,int r, int k){
		int q=0;  
	    if(p>=r)  
	    {  
	        return;  
	    }  
	      
	    if(r-p+1<k)  
	    {  
	        InsertionSort(A,p,r);  
	    }  
	    else  
	    {  
	        q=partition(A,p,r);  
	        quicksort(A,p,q-1,k);  
	        quicksort(A,q+1,r,k);  
	    }  
	}

	
	public void swap(int [] arr,int x ,int y)
	{
		int temp=arr[x];
		arr[x]=arr[y];
		arr[y]=temp;
	}
}
package test;


public class Test {


	/**
	 * @param args
	 */
	
	private static int BUFFER_SIZE = 1000000;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = new int[BUFFER_SIZE];
		int[] brr = new int[BUFFER_SIZE];
		for(int i = 0; i< arr.length;i++)
		{
			arr[i] =(int) (Math.random()*1000000+1);
		}
		
		for(int k = 0;k<=100;k++)
		{
			brr=arr.clone();
			QuickSort qs = new QuickSort();	
			long time1 = System.currentTimeMillis();
			qs.quicksort(brr, 0, brr.length-1,k);
			long time2 =  System.currentTimeMillis();
			if(k%4==0)
				System.out.println(); 
			System.out.print("k = "+k+"运行时间:");
			System.out.print(time2-time1+"ms"+"   ");
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值