Sorting 快速排序递归

Sorting 快速排序递归,sorting,recursion,groovy,quicksort,Sorting,Recursion,Groovy,Quicksort,因此,我成功地实现了一个快速排序,每次都使用最左边的元素作为轴心。我一直在尝试使用中间元素实现快速排序,结果很复杂。我一直在研究一些示例,这些示例使quicksort递归地调用自身,而不以任何形式包装调用,并且,正如您可能想象的那样,它在第一次调用自身时就被卡住了 使用我使用的示例对partition进行的第一次调用正确地对数组进行了分区,然后当它接近末尾时,只需在开始时一次又一次地交换这两个元素 我尝试的策略是从列表中选择中间元素作为轴心,将其存放在数组末尾,然后继续交换索引。在完成传递之后,

因此,我成功地实现了一个快速排序,每次都使用最左边的元素作为轴心。我一直在尝试使用中间元素实现快速排序,结果很复杂。我一直在研究一些示例,这些示例使quicksort递归地调用自身,而不以任何形式包装调用,并且,正如您可能想象的那样,它在第一次调用自身时就被卡住了

使用我使用的示例对partition进行的第一次调用正确地对数组进行了分区,然后当它接近末尾时,只需在开始时一次又一次地交换这两个元素

我尝试的策略是从列表中选择中间元素作为轴心,将其存放在数组末尾,然后继续交换索引。在完成传递之后,我将轴心放在分区数组之间。在经过几次之后看起来不错,但是正如我提到的,很早就被卡住了,而且从来没有得到应该对第二个分区进行排序的调用

任何轻推都将不胜感激——我也在groovy中工作,如果您看到了什么的话(希望这不会引起任何问题,但我避免了为此而键入duck)

原始数组是

[100305,220220018,9921130,501000403440077]

当达到堆栈溢出时,数组

[2,4,18,30,50,99,7710021110004033054002002]

类其他快速排序{
静态无效排序(int[]数组){
快速排序(数组,0,array.length-1)
}
静态void快速排序(int[]数组,int first,int last){
int pivotIndex=分区(数组、第一个、最后一个)
快速排序(数组,第一个,数据透视索引-1)
快速排序(数组、数据透视索引、最后一个)
}
静态int分区(int[]数组,int first,int last){
int pivotIndex=(第一个+最后一个)/2
int pivotValue=数组[pivotIndex]
交换(数组、数据透视索引、最后一个)
int indexFromRight=last-1
int indexFromLeft=第一个
while(indexFromLeft数据透视值){
indexFromRight--
}

如果(indexFromLeft您需要更新您的快速排序方法。数据透视索引中的值已处于其排序位置,因此您无需再次传递它

static void quickSort(int[] array, int first, int last){
    if(last > first){
        int pivotIndex = partition(array, first, last);

        quickSort(array, first, pivotIndex-1);
        quickSort(array, pivotIndex+1, last);
    }
}

这很有趣,因为我发现了很多围绕这一点的相互矛盾的解决方案,我已经看到了这一点(至少在纸上)如果没有if条件包装递归,我无法想象它们是如何不被调用的。这就是让我对@nbpeth不屑一顾的原因。存在多种方法,每次我看到一个实现时,我都会感到困惑。代码没有按照伪代码中的指定进行完全转换。
static void quickSort(int[] array, int first, int last){
    if(last > first){
        int pivotIndex = partition(array, first, last);

        quickSort(array, first, pivotIndex-1);
        quickSort(array, pivotIndex+1, last);
    }
}