62,614
社区成员
发帖
与我相关
我的任务
分享
import java.util.Arrays;
/**
* Created by Alan on 2017/1/22.
*/
public class QuickSort {
public static final int CUTOFF=10;
public static void main(String[] args) {
Integer[] data=new Integer[]{15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
quickSort(data,0,data.length-1);
System.out.println(Arrays.toString(data));
}
/**
* 取最右、最左、居中元素的大小居中者为枢纽元,三者排序后,下标为center的元素为枢纽元,下标为left的元素肯定小于枢纽元,下标为right的元素肯定大于枢纽元
* 将枢纽元与下标right-1的元素交换位置,则下标right-1的元素则成枢纽元
* @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];
}
/**
* 数组元素交换位置
* @param data
* @param a
* @param b
* @param <T>
*/
public static <T>void swap(T[] data,int a,int b){
T t=data[a];
data[a]=data[b];
data[b]=t;
}
/**
* 插入排序
* @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;
int len=right-left+1;
for(int i=left+1;i<len;i++){
T temp=data[i];
for(j=i;j>left && data[j-1].compareTo(temp)>0;j--){
data[j]=data[j-1];
}
data[j]=temp;
}
}
/**
* 快速排序
* @param data
* @param left
* @param right
* @param <T>
*/
public static <T extends Comparable<? super T>>void quickSort(T[] data,int left,int right){
//数组大小大于10的时候进行快速排序,小于等于10的时候进行插入排序
if(right-left+1>CUTOFF){
T pivot=median(data,left,right);
int i=left,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);
}
}
}
输出结果为[1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 9, 15],不知道问题出在哪里,求解答。ps:插入排序的算法没错