Java 快速排序的轴选择,发生了什么,我的算法有什么不正确的地方吗?
有人能指导我实施快速排序吗。当我选择pivot作为数组中的最后一个元素时,我试图将我的快速排序实现的错误形象化 下面是我的代码:Java 快速排序的轴选择,发生了什么,我的算法有什么不正确的地方吗?,java,algorithm,sorting,quicksort,Java,Algorithm,Sorting,Quicksort,有人能指导我实施快速排序吗。当我选择pivot作为数组中的最后一个元素时,我试图将我的快速排序实现的错误形象化 下面是我的代码: public void quickSort(int[] input, int left, int right) { if(left < right) { //int pivot = input[(left + right) / 2]; // works fine with this //in
public void quickSort(int[] input, int left, int right) {
if(left < right) {
//int pivot = input[(left + right) / 2]; // works fine with this
//int pivot = input[left]; // works fine with this
int pivot = input[right];
int index = partition(input, left, right, pivot); // line 12
quickSort(input, left, index - 1); // line 13
quickSort(input, index, right); // line 14
}
}
private int partition(int[] input, int left, int right, int pivot) {
while(left <= right) {
while(input[left] < pivot) {
left++;
}
while(input[right] > pivot) {
right--;
}
if(left <= right) {
int temp = input[left];
input[left] = input[right];
input[right] = temp;
left++;
right--;
}
}
return left;
}
当pivot是输入[右]
时,它会失败,但
Exception in thread "main" java.lang.StackOverflowError
at com.maverick.solution.Solution.quickSort(Solution.java:12)
at com.maverick.solution.Solution.quickSort(Solution.java:13)
请指导我,纠正问题或哪里出了问题
谢谢 当最大的元素到达数组的末尾时,问题基本上就出现了。在这种情况下,
left
和right
的值将相等,partition()
将返回array。length+1
和相同的函数调用将反复进行
示例:[5,4,3,2,1]
如果调试代码,您将看到问题在快速排序([1,4,3,2,5],1,4)
调用发生时开始。这将调用partition()
,返回5,在下一行快速排序([1,4,3,2,5],1,4)
发生时,循环继续
当左
和右
值相等,且右
位置存在最大元素时,可能需要对分区()进行逻辑校正
考虑一下partition()
的工作,它基本上是返回索引,直到对哪个数组进行排序,您的partition()
逻辑实现了它吗
尝试不同的输入并调试代码
有关快速排序的更多信息,请参阅
Exception in thread "main" java.lang.StackOverflowError
at com.maverick.solution.Solution.quickSort(Solution.java:12)
at com.maverick.solution.Solution.quickSort(Solution.java:13)