Java中的快速排序问题
我正在尝试使用递归和几种方法来实现快速排序。当我运行这个程序时,我会收到一条越界消息,告诉我我已经转向数组的索引-1。有人能提供关于修复我的快速排序方法的建议吗?(这就是问题所在)。我知道我的其他方法是正确的 示例{7,6,5,4,3,2,1} 应该是{1,2,3,4,5,6,7}Java中的快速排序问题,java,quicksort,Java,Quicksort,我正在尝试使用递归和几种方法来实现快速排序。当我运行这个程序时,我会收到一条越界消息,告诉我我已经转向数组的索引-1。有人能提供关于修复我的快速排序方法的建议吗?(这就是问题所在)。我知道我的其他方法是正确的 示例{7,6,5,4,3,2,1} 应该是{1,2,3,4,5,6,7} public static <T extends Comparable<? super T>> void quickSort(T[] a) { quickSort(a,0,a.
public static <T extends Comparable<? super T>> void quickSort(T[] a) {
quickSort(a,0,a.length - 1);
}
public static <T extends Comparable<? super T>> void quickSort(T[] a,int start,int end) {
if(start<end) {
int pivotIndex = partition(a, start, end);
quickSort(a,start,pivotIndex-1); // sort left partition
quickSort(a,pivotIndex+1,end); // sort right partition
}
}
public static <T extends Comparable<? super T>> int partition(T[] a, int start, int end) {
int mid =midpoint(start,end);
sortFirstMiddleLast(a,start,mid,end);
swap(a,mid,end-1);
int pivotIndex = end -1 ;
T pivotValue = a[pivotIndex];
int indexFromLeft = start +1 ;
int indexFromRight = end -2;
boolean done = false;
while (!done) {
while (a[indexFromLeft].compareTo(pivotValue)<0) {
indexFromLeft++;
}
while (a[indexFromRight].compareTo(pivotValue)>0) {
indexFromRight--;
}
if (indexFromLeft < indexFromRight) {
swap(a,indexFromLeft,indexFromRight);
indexFromLeft++;
indexFromRight--;
}
else {
done=true;
}
}
swap(a,pivotIndex,indexFromLeft);
pivotIndex=indexFromLeft;
return pivotIndex;
}
public static <T extends Comparable<? super T>> void sortFirstMiddleLast(T[] a, int start, int mid, int end) {
if (a[start].compareTo(a[mid])>0) {
swap(a,start,mid);
}
else if (a[mid].compareTo(a[end])>0) {
swap(a,mid,end);
}
else if (a[start].compareTo(a[end])>0) {
swap(a,start,end);
}
else if(a[start].compareTo(a[mid])>0) {
swap (a,start,mid);
}
}
private static int midpoint(int first, int last) {
return first + (last - first) / 2;
}
private static void swap(Object[] a, int first, int second) {
Object temp = a[first];
a[first] = a[second];
a[second] = temp;
}
公共静态该代码是霍尔分区方案的变体。假设您不想向内部循环添加范围检查,那么pivot元素需要在左索引和右索引之间的范围内。两个内循环后的if应使用左索引j)
打破
t=a[i];
a[i]=a[j];
a[j]=t;
i++;
j--;
}
快速排序(a、lo、j);
快速排序(a、i、hi);
}
您尚未共享swap
方法的代码。很抱歉,刚刚发布了它。您需要在while
循环中的一个内部上进行范围检查。请参阅任何经典实现。@user207421-如果pivot未从起始索引对中排除,则不需要进行范围检查。
void QuickSort(int a[], int lo, int hi)
{
int i, j;
int p, t;
if(lo >= hi)
return;
p = a[lo + (hi-lo)/2];
i = lo;
j = hi;
while (i <= j){
while (a[i] < p)i++;
while (a[j] > p)j--;
if (i > j)
break;
t = a[i];
a[i] = a[j];
a[j] = t;
i++;
j--;
}
QuickSort(a, lo, j);
QuickSort(a, i, hi);
}