当输入数据基本有序时,插入排序的速度很快。因此我们可以利用这一点来提高快速排序的的速度。当对一个小于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"+" "); } } }