Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于pivot的分区阵列_Java_Algorithm_Sorting_Pivot_Quicksort - Fatal编程技术网

Java 基于pivot的分区阵列

Java 基于pivot的分区阵列,java,algorithm,sorting,pivot,quicksort,Java,Algorithm,Sorting,Pivot,Quicksort,我编写了一个基于pivot的分区数组的简单实现。为简单起见,将数组中的第一个元素作为枢轴元素。下面是我写的代码 public static void partitionOnPivot(int[] a , int lo , int hi) { int pivot = lo; while (lo < hi) { while(a[lo] <= a[pivot]) lo++; while(a[hi] > a[pivot]) h

我编写了一个基于pivot的分区数组的简单实现。为简单起见,将数组中的第一个元素作为枢轴元素。下面是我写的代码

public static void partitionOnPivot(int[] a , int lo , int hi)
{

    int pivot = lo;

    while (lo < hi)
    {
        while(a[lo] <= a[pivot]) lo++;
        while(a[hi] > a[pivot]) hi--;

        if(lo < hi) //we are already done with these cases
        {
            ArrayUtil.swap(a, lo++, hi--);
        }
    }

    ArrayUtil.swap(a, pivot, lo);

}
在某一点上,
lo
hi
都将位于索引1

此时,26与84交换,输出变为
{84,26,98,45}
。26个应该被单独留下


我已经做了很长时间的一些改变,但没有任何进展。我们如何处理这件棘手的案子?程序中有任何错误吗?

在外部while循环结束时使用此语句

ArrayUtil.swap(a, pivot, hi);
ArrayUtil.swap(a,lo++,hi--)++
是后增量,所以您将高元素与枢轴交换,然后增加枢轴。

“在某一点上,lo和hi都将位于索引1”->错误 从您编写的程序可以清楚地看出,lo将位于索引1,而hi将位于索引0。因此,将跳过以下if条件,并执行最后一行交换两个索引处的值

  if(lo < hi) //THE FOLLOWING STATEMENT WILL BE SKIPPED
   {
        ArrayUtil.swap(a, lo++, hi--);
   } 


我认为递增和递减运算符是邪恶的。在使用它们时,必须真正注意后/前行为。尽量避开它们。

对不起,我要发疯了——不要理会我的答案。为什么while(a[hi]>a[pivot])hi--;成为while(a[hi-1]>a[pivot])hi--?如果一个[hi] if(lo < hi) //THE FOLLOWING STATEMENT WILL BE SKIPPED { ArrayUtil.swap(a, lo++, hi--); }
while(a[lo] <= a[pivot]) lo++;
while(a[hi] > a[pivot]) hi--;
while(a[lo + 1] <= a[pivot]) lo++;
while(a[hi - 1] > a[pivot]) hi--;
ArrayUtil.swap(a, lo++, hi--);
ArrayUtil.swap(a, lo, hi);