Java 如何编写快速排序分区函数

Java 如何编写快速排序分区函数,java,algorithm,quicksort,Java,Algorithm,Quicksort,这让我抓狂,我知道这是一些一次性错误造成的,但由于某些原因,我的分区函数分区不正确。我做错了什么 public static int partition(int numbers[], int lhs, int rhs) { int pivot = numbers[(rhs - lhs) / 2]; int lIndex = lhs - 1; int rIndex = rhs + 1; while (true) { while (numbers[+

这让我抓狂,我知道这是一些一次性错误造成的,但由于某些原因,我的分区函数分区不正确。我做错了什么

public static int partition(int numbers[], int lhs, int rhs) {
    int pivot = numbers[(rhs - lhs) / 2];
    int lIndex = lhs - 1;
    int rIndex = rhs + 1;

    while (true) {
        while (numbers[++lIndex] < pivot);
        while (numbers[--rIndex] > pivot);

        if (lIndex > rIndex) break;

        int temp = numbers[lIndex];
        numbers[lIndex] = numbers[rIndex];
        numbers[rIndex] = temp;
    }

    return lIndex;
}
publicstaticint分区(int-numbers[],int-lhs,int-rhs){
整数轴=数字[(右-左)/2];
int-lIndex=lhs-1;
int-rIndex=rhs+1;
while(true){
而(数字[++lIndex]pivot);
如果(lIndex>rIndex)破裂;
int temp=数字[lIndex];
数字[lIndex]=数字[rIndex];
数字[rIndex]=温度;
}
返回林黛克斯;
}
这里有一个问题:

int pivot = numbers[(rhs - lhs) / 2];
假设
lhs
=100和
rhs
=120。上面将选择元素(120-100)/2=10作为枢轴

我想你想要像这样的东西

int pivot = numbers[(rhs + lhs) / 2];
这将至少在您尝试分区的范围内选择一个轴

这里有一个问题:

int pivot = numbers[(rhs - lhs) / 2];
假设
lhs
=100和
rhs
=120。上面将选择元素(120-100)/2=10作为枢轴

我想你想要像这样的东西

int pivot = numbers[(rhs + lhs) / 2];

这将至少在您尝试分区的范围内选择一个轴

最好找到轴心点(在您的案例中为中点):

int pivot=数字[lhs+(rhs-lhs)/2]


如果lhs和rhs足够高,它可以防止lhs+rhs导致整数溢出。

最好找到轴心点(在您的情况下为中点):

int pivot=数字[lhs+(rhs-lhs)/2]


如果lhs和rhs足够高,它可以防止lhs+rhs导致整数溢出。

这里有一个例子:什么是正确的,什么是不正确的?正确意味着它返回
lIndex
,它应该是正确放置的枢轴元素。左边的东西都比轴心小,右边的东西都比轴心大。我理解快速排序的工作原理。但我的实现有点不对劲。我想也许更多的眼睛会有帮助。这里有一个例子:什么是正确的,什么是不正确的?正确的意思是它返回
lIndex
,这应该是正确放置的枢轴元素。左边的东西都比轴心小,右边的东西都比轴心大。我理解快速排序的工作原理。但我的实现有点不对劲。我想也许更多的眼睛会有帮助。大型阵列的枢轴功能受损。正确的版本是
lhs+(rhs-lhs)/2
,我很确定这就是他最初计划做的。@Voo:这个表达式与我的表达式永远不会有超过1个不同(事实上,它可能是相同的;我没有检查边缘情况)。哦,它完全相同。。如果忽略溢出。但是,如果正确的解决方案几乎相同并且在所有情况下都有效,则不应该这样做。正确的版本是
lhs+(rhs-lhs)/2
,我很确定这就是他最初计划做的。@Voo:这个表达式与我的表达式永远不会有超过1个不同(事实上,它可能是相同的;我没有检查边缘情况)。哦,它完全相同。。如果忽略溢出。但是,如果正确的解决方案几乎相同并且在所有情况下都有效,那么您真的不应该这样做。