Java 基于pivot的分区阵列
我编写了一个基于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
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);