Java 快速排序代码总是给我StackOverflower错误
我已经为快速排序编写了这段代码,但是我得到了StackOverflower错误,我找不到原因。我试图确保递归有正确的枢轴、前后值,这是我认为混乱的地方,但在这一点上我不太确定Java 快速排序代码总是给我StackOverflower错误,java,sorting,recursion,quicksort,Java,Sorting,Recursion,Quicksort,我已经为快速排序编写了这段代码,但是我得到了StackOverflower错误,我找不到原因。我试图确保递归有正确的枢轴、前后值,这是我认为混乱的地方,但在这一点上我不太确定 { int intTemp = 0; int intPivotP = intPivot; int intFrontP = intFront; int intBackP = intBack; //System.out.println ("front"
{
int intTemp = 0;
int intPivotP = intPivot;
int intFrontP = intFront;
int intBackP = intBack;
//System.out.println ("front");
while (intFront != intBack - 1 && intFront < intBack)
{
//System.out.println ("while");
if (aClone [intFront] <= aClone [intPivot] && aClone [intBack] >= aClone [intPivot])
{
intFront = intFront + 1;
intBack = intBack - 1;
}
else if (aClone [intFront] > aClone [intPivot] && aClone [intBack] >= aClone [intPivot])
{
intBack = intBack - 1;
}
else if (aClone [intFront] <= aClone [intPivot] && aClone [intBack] < aClone [intPivot])
{
intFront = intFront + 1;
}
else if (aClone [intFront] > aClone [intPivot] && aClone [intBack] < aClone [intPivot])
{
intTemp = aClone [intBack];
aClone [intBack] = aClone [intFront];
aClone [intFront] = intTemp;
}
}
if (intFrontP < intBackP)
{
//quick ((intBackP - intFrontP) / 2 + intFrontP, intFrontP, intPivotP - 1);
quick ((intPivotP - intFrontP) / 2 + intFrontP, intFrontP, intPivotP - 1);
quick ((intBackP - intPivotP) / 2 + intPivotP, intPivotP, intBackP);
}
}
{
intTemp=0;
int intPivotP=intPivot;
int intFrontP=intFront;
int intBackP=intBack;
//System.out.println(“前”);
while(intFront!=intBack-1&&intFrontaClone[intPivot]&&aClone[intBack]>=aClone[intPivot])
{
intBack=intBack-1;
}
else if(aClone[intFront]aClone[intPivot]&&aClone[intBack]
为了澄清起见,
aClone
是一个整数数组。它看起来像快速排序。但是如果您想知道它是否是一个正确的实现。。。。测试它。@StephenC-hm,很难测试,你如何从合并排序中分辨出来,两者都在排序……实际上,从问题块的角度来看,删除被否决的问题并不能修复被否决的问题。(那太容易了。问一个糟糕的问题,删除它,重复一次。问题块的设计是为了让你不能做那种事情。)删除的最好方法是阻止更多的反对票。如果你关心你的声誉,和/或不想让问题被阻止,最好的策略是不要问糟糕的问题。这并不难做到。您只需要阅读、理解并遵循指南。示例代码似乎不起作用。一个关键问题是,当需要在递归调用中将输入参数重新用作参数时,输入参数会被修改。枢轴需要是值而不是索引,因为交换可能会移动枢轴。比较通常是<而不是>=。该代码似乎是对霍尔分区方案的尝试。快速排序的wiki文章包括。根据Wiki伪代码重写代码。它看起来像快速排序。但是如果您想知道它是否是一个正确的实现。。。。测试它。@StephenC-hm,很难测试,你如何从合并排序中分辨出来,两者都在排序……实际上,从问题块的角度来看,删除被否决的问题并不能修复被否决的问题。(那太容易了。问一个糟糕的问题,删除它,重复一次。问题块的设计是为了让你不能做那种事情。)删除的最好方法是阻止更多的反对票。如果你关心你的声誉,和/或不想让问题被阻止,最好的策略是不要问糟糕的问题。这并不难做到。您只需要阅读、理解并遵循指南。示例代码似乎不起作用。一个关键问题是,当需要在递归调用中将输入参数重新用作参数时,输入参数会被修改。枢轴需要是值而不是索引,因为交换可能会移动枢轴。比较通常是<而不是>=。该代码似乎是对霍尔分区方案的尝试。快速排序的wiki文章包括。根据Wiki伪代码重写代码。