我正在研究this的QuickSort算法的简单实现。
我在使用分区方法时遇到了麻烦。我已重命名变量以帮助我理解。我了解大多数方法,但是有一个我无法达到目的的变量。那就是store
变量。
这是该方法的我版本:
private int partition(int[] array, int startIndex, int endIndex)
{
int pivotIndex = getPivot(startIndex, endIndex);
swapElements(array, pivotIndex, endIndex);
pivotIndex = endIndex;
int store = startIndex;
for(int currentIndex = startIndex; (currentIndex <= endIndex - 1); currentIndex++)
{
if(array[currentIndex] <= array[pivotIndex])
{
swapElements(array, currentIndex, store);
store++;
}
}
swapElements(array, store, pivotIndex);
pivotIndex = store;
return pivotIndex;
}
store
变量的用途是什么?如果startIndex
和currentIndex
已经指向数组的第一个索引,为什么需要store
做同样的事情?在做什么?
答案 0 :(得分:1)
要回答一个更简单的问题,您应该能够看到随着迭代的进行store
与currentIndex
并不相同。仅当array[currentIndex] <= array[pivotIndex]
对特定迭代为true时,它才递增。 -因此store
通常会小于currentIndex
。
要更具体地回答,这是在开始时您选择了指向某个值的pivotIndex
。然后,您要在表中四处移动元素,以便所有小于pivotIndex
值的值都在数组中该值之前,而所有大于pivotIndex
值的值都在该值之后在数组中。 store
跟踪下一个小于pivotIndex
的值的位置。将该值移到store
位置,然后将store
递增以移过该值并表示应将下一个较小的值放置在何处。
在迭代结束时,由于store
之前的所有值均小于该值,而{{1}之后的所有值均被设计为指向枢轴值应位于的位置}更大。因此,最后,将枢轴值移动到store
所指向的位置,并且store
成为分区操作的最终索引,该索引指向枢轴值