快速排序优化

来源:互联网 发布:123软件是什么 编辑:程序博客网 时间:2024/05/16 04:47

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