快速排序算法出错了,求大神解答

tn_java 2017-01-22 10:36:46
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:插入排序的算法没错
...全文
198 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
tn_java 2017-01-23
  • 打赏
  • 举报
回复
来个大神指点指点啊
tn_java 2017-01-23
  • 打赏
  • 举报
回复
引用 1 楼 Inhibitory 的回复:
while(i<j && data[i++].compareTo(pivot)<=0) while(i<j && data[j--].compareTo(pivot)>=0) swap(data,i,right-1); // 应该不需要
这个要有,交换之后,data[i]就成了枢纽元,左边所有都是小于枢纽元的元素,右边都是大于枢纽元的元素
Inhibitory 2017-01-23
  • 打赏
  • 举报
回复
while(i<j && data[i++].compareTo(pivot)<=0) while(i<j && data[j--].compareTo(pivot)>=0) swap(data,i,right-1); // 应该不需要
tn_java 2017-01-23
  • 打赏
  • 举报
回复
引用 1 楼 Inhibitory 的回复:
while(i<j && data[i++].compareTo(pivot)<=0) while(i<j && data[j--].compareTo(pivot)>=0) swap(data,i,right-1); // 应该不需要
调试了一下,发现是插入算法的问题,for循环部分应该是i<=right。按照错误代码的思路,元素个数小于10的时候,进行插入排序。第一轮排序过后,数据分成了小于枢纽元的部分、枢纽元和大于枢纽元的部分。之后进行插入排序,小于枢纽元部分是正确的,而大于枢纽元部分,i的起始位置直接就大于len了。分还是给你了吧

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧