java - QuickSort 的枢轴选择,发生了什么,我的算法中有什么不正确的吗?
问题描述
有人可以指导我实施 QuickSort。当我选择枢轴作为数组中的最后一个元素时,我试图想象我的快速排序实现有什么问题。
下面是我的代码:
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;
}
如果当我选择枢轴时工作正常
int pivot = input[(left + right) / 2]; // works with this
int pivot = input[left + (right - left) / 2]; // works with this
int pivot = input[left]; // works with this
当 pivot 是input[right]
时,它会失败,除了
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]
如果您调试代码,您将看到问题在quickSort([1,4,3,2,5],1,4)
调用发生时开始。这个调用partition()
返回 5 并在下一行再次quickSort([1,4,3,2,5],1,4)
发生,循环继续。
partition()
当left
和right
值变得相等并且最大元素出现在right
位置时,可能需要对逻辑进行更正。
想想 的工作partition()
,基本上是返回索引直到哪个数组被排序,你的逻辑是partition()
实现它吗?
尝试不同的输入并调试代码。
有关快速排序的更多信息,您可以参考这本书
推荐阅读
- java - Spring中部分数据导入的新事务
- c - C UDP套接字连接没有正确分配端口
- vue.js - Vue JS 和 Quasar:路由器视图中的 @functionname 是什么?
- python - Python:如何导入写在另一个目录中的文件中的函数?
- angular - 带 Angular 的雪堆?
- python - ConnectionRefusedError: [Errno 111] GUI 拒绝连接,但 __name__ 拒绝连接 == '__main__'
- javascript - 无法在另一个数组中创建 javascript 数组
- android - 如何强制 Room 的 OnCreate 回调工作?
- reactjs - Using for each to create react components within another component
- c# - 无法反序列化当前 JSON 错误