java - 在快速排序中使用最后一个元素作为枢轴时无法解决错误
问题描述
我已经用 Java 实现了快速排序。使用第一个元素作为枢轴的代码工作正常。我正在尝试以类似的方式使用最后一个元素作为枢轴来实现它,但无法找出它崩溃的原因。
partitionFirst()
函数使用第一个元素作为枢轴
partitionLast()
函数使用最后一个元素作为枢轴
代码在我在代码中提到的第 75 行和第 77 行中断。使用时partitionLast()
如果你注意到partitionLast()
我以不同的方式返回了枢轴逻辑,请记住枢轴总是小于元素的情况。例如。{ 7 8 9 4 5 6 |3| } 其中 3 是分区
如果有人可以指出代码中的错误,那将会很有帮助。如果有的话,也可以随时提出优化建议。
public class QuickSort {
public void swap(int[] arr, int i, int j)
{
if(i!=j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
public int partitionFirst(int arr[], int start,int end)
{
int j = start + 1;
int pivot = arr[start];
for(int i=start+1;i<end;i++)
{
if(pivot > arr[i])
{
swap(arr,i,j);
j++;
}
}
swap(arr,start,j-1);
return (j-1);
}
public int partitionLast(int arr[], int start,int end)
{
int j = start;
int pivot = arr[(end - 1)];
for(int i=start;i < end - 1 ;i++)
{
if(pivot > arr[i])
{
swap(arr,i,j);
j++;
}
}
if((j - 1) < 0)
{
swap(arr,end-1 ,j);
return j;
}
else
{
swap(arr,end-1 ,(j-1));
return (j-1);
}
}
public void QuickSort(int arr[], int start,int end)
{
if(end > start)
{
int p = partitionLast(arr, start, end); //75 line
QuickSort(arr,start, p);
QuickSort(arr,p+1,end); //77 line
}
return;
}
public static void main(String args[]) throws FileNotFoundException
{
int[] brr = {1,6,8,2,3,4};
QuickSort ob1 = new QuickSort();
ob1.QuickSort(brr,0,brr.length);
}
}
/* 在 QuickSort.QuickSort(QuickSort.java:75) 在 QuickSort.QuickSort(QuickSort.java:77) 在 QuickSort.QuickSort(QuickSort.java:77) 的线程“main”java.lang.StackOverflowError 中的异常 .... ... */
解决方案
这一切都归结为用枢轴交换正确的元素:
public int partitionLast(int arr[], int start,int end)
{
int j = start;
int pivot = arr[(end - 1)];
for(int i=start;i < end - 1 ;i++)
{
if(pivot > arr[i])
{
swap(arr,i,j);
j++;
}
}
swap(arr,end-1,j);
return (j);
}
推荐阅读
- arrays - 我是汇编语言编程的初学者,无法找出给定数组中的负数
- c# - 从水平轴和垂直轴获取角度
- reactjs - Reactjs 从子节点传递道具
- c - 我怎样才能让'C'中的这个回文程序重复五次?
- android - Android Studio:context.getFilesDir() 返回我找不到的路径 [/data/user/0/com.example.filesexperimenting/files/]。我错过了什么?
- wpf - 使用用户控件的 WPF 通知气球
- reactjs - withRouter 不能与 redux 一起正常工作 - react redux react-router
- node.js - 无法使 axios.put 从反应到 node.js 服务器
- javascript - html2canvas iframe 和图像捕获并保存到服务器
- c# - 如何根据在使用 SQLite 填充的组合框中选择的项目更改标签的文本?