import java.util.Arrays;
import java.util.Random;
/**
* Created by Alan on 2016/12/26.
*/
public class QuickSort {
public static final int CUTOFF=10;
public static <T>void print(T[] data){
System.out.println(Arrays.toString(data));
}
public static <T extends Comparable<?super T>>void swap(T[] data,int a,int b){
T t=data[a];
data[a]=data[b];
data[b]=t;
}
/**
* 取得枢纽元
* 将数组最左元素、最右元素和中间元素这3个元素做比较,比较之后将最小元素放最左边,较大元素放中间,最大元素放最右边
* 较大元素即为枢纽元
* 这么一来,最左边元素一定是小元素,一定分在小元素数组里面;最右边元素一定是大元素,一定分在大元素数组里面。所以在后面进行快排的时候,这两个数据不用参与比较
* 于是,将枢纽元与倒数第二个元素交换位置,即倒数第二个元素成了枢纽元
* @param data 数组
* @param left 最左元素的索引
* @param right 最右元素的索引
* @param <T> 数组类型
* @return 返回倒数第二个位置的元素
*/
public static <T extends Comparable<?super T>>T median(T[] data,int left,int right){
int center=(left+right)/2;
if(data[left].compareTo(data[center])>0){
swap(data,left,center);
}
if(data[left].compareTo(data[right])>0){
swap(data,left,right);
}
if(data[center].compareTo(data[right])>0){
swap(data,center,right);
}
swap(data,center,right-1);
return data[right-1];
}
public static <T extends Comparable<?super T>>void quickSort(T[] data,int left,int right){
//当数组的大小大于10时,进行快速排序;当数组大小小于或等于10时,进行插入排序
if(left+CUTOFF<right+1){
T pivot=median(data,left,right); //枢纽元
int i=left;
int j=right-1;
for(;;){
while(data[++i].compareTo(pivot)<0){}
while(data[--j].compareTo(pivot)>0){}
if(i<j){
swap(data,i,j);
}else{
break;
}
}
swap(data,i,right-1);
quickSort(data,left,i-1);
quickSort(data,i+1,right);
}else{
insertionSort(data, left, right);
}
}
/**
* 插入排序
* @param data 数组
* @param left 通过插入排序进行排序的起始位置
* @param right 通过插入排序进行排序的末尾位置
* @param <T> 数组类型
*/
public static <T extends Comparable<?super T>>void insertionSort(T[] data,int left,int right){
int j;
for(int i=left+1;i<=right;i++){
T t=data[i];
for(j=i;j>left && data[j-1].compareTo(t)>0;j--){
data[j]=data[j-1];
}
data[j]=t;
}
}
public static void main(String[] args) {
Random rnd=new Random();
Integer[] temp=new Integer[10000000];
for(int x=0;x<temp.length;x++){
temp[x]=rnd.nextInt(10000000);
}
long start=System.currentTimeMillis();
quickSort(temp,0,temp.length-1);
long end=System.currentTimeMillis();
print(temp);
System.out.println((end-start)+"ms");
}
}
快速排序
最新推荐文章于 2022-03-10 11:14:38 发布